sbpcd.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:164k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  sbpcd.c   CD-ROM device driver for the whole family of traditional,
  3.  *            non-ATAPI IDE-style Matsushita/Panasonic CR-5xx drives.
  4.  *            Works with SoundBlaster compatible cards and with "no-sound"
  5.  *            interface cards like Lasermate, Panasonic CI-101P, Teac, ...
  6.  *            Also for the Longshine LCS-7260 drive.
  7.  *            Also for the IBM "External ISA CD-Rom" drive.
  8.  *            Also for the CreativeLabs CD200 drive.
  9.  *            Also for the TEAC CD-55A drive.
  10.  *            Also for the ECS-AT "Vertos 100" drive.
  11.  *            Not for Sanyo drives (but for the H94A, sjcd is there...).
  12.  *            Not for any other Funai drives than the CD200 types (sometimes
  13.  *             labelled E2550UA or MK4015 or 2800F).
  14.  */
  15. #define VERSION "v4.63 Andrew J. Kroll <ag784@freenet.buffalo.edu> Wed Jul 26 04:24:10 EDT 2000"
  16. /*   Copyright (C) 1993, 1994, 1995  Eberhard Moenkeberg <emoenke@gwdg.de>
  17.  *
  18.  *   This program is free software; you can redistribute it and/or modify
  19.  *   it under the terms of the GNU General Public License as published by
  20.  *   the Free Software Foundation; either version 2, or (at your option)
  21.  *   any later version.
  22.  *
  23.  *   You should have received a copy of the GNU General Public License
  24.  *   (for example /usr/src/linux/COPYING); if not, write to the Free
  25.  *   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26.  *
  27.  *   If you change this software, you should mail a .diff file with some
  28.  *   description lines to emoenke@gwdg.de. I want to know about it.
  29.  *
  30.  *   If you are the editor of a Linux CD, you should enable sbpcd.c within
  31.  *   your boot floppy kernel and send me one of your CDs for free.
  32.  *
  33.  *   If you would like to port the driver to an other operating system (f.e.
  34.  *   FreeBSD or NetBSD) or use it as an information source, you shall not be
  35.  *   restricted by the GPL under the following conditions:
  36.  *     a) the source code of your work is freely available
  37.  *     b) my part of the work gets mentioned at all places where your 
  38.  *        authorship gets mentioned
  39.  *     c) I receive a copy of your code together with a full installation
  40.  *        package of your operating system for free.
  41.  *
  42.  *
  43.  *  VERSION HISTORY
  44.  *
  45.  *  0.1  initial release, April/May 93, after mcd.c (Martin Harriss)
  46.  *
  47.  *  0.2  thek "repeat:"-loop in do_sbpcd_request did not check for
  48.  *       end-of-request_queue (resulting in kernel panic).
  49.  *       Flow control seems stable, but throughput is not better.  
  50.  *
  51.  *  0.3  interrupt locking totally eliminated (maybe "inb" and "outb"
  52.  *       are still locking) - 0.2 made keyboard-type-ahead losses.
  53.  *       check_sbpcd_media_change added (to use by isofs/inode.c)
  54.  *       - but it detects almost nothing.
  55.  *
  56.  *  0.4  use MAJOR 25 definitely.
  57.  *       Almost total re-design to support double-speed drives and
  58.  *       "naked" (no sound) interface cards ("LaserMate" interface type).
  59.  *       Flow control should be exact now.
  60.  *       Don't occupy the SbPro IRQ line (not needed either); will
  61.  *       live together with Hannu Savolainen's sndkit now.
  62.  *       Speeded up data transfer to 150 kB/sec, with help from Kai
  63.  *       Makisara, the "provider" of the "mt" tape utility.
  64.  *       Give "SpinUp" command if necessary.
  65.  *       First steps to support up to 4 drives (but currently only one).
  66.  *       Implemented audio capabilities - workman should work, xcdplayer
  67.  *       gives some problems.
  68.  *       This version is still consuming too much CPU time, and
  69.  *       sleeping still has to be worked on.
  70.  *       During "long" implied seeks, it seems possible that a 
  71.  *       ReadStatus command gets ignored. That gives the message
  72.  *       "ResponseStatus timed out" (happens about 6 times here during
  73.  *       a "ls -alR" of the YGGDRASIL LGX-Beta CD). Such a case is
  74.  *       handled without data error, but it should get done better.
  75.  *
  76.  *  0.5  Free CPU during waits (again with help from Kai Makisara).
  77.  *       Made it work together with the LILO/kernel setup standard.
  78.  *       Included auto-probing code, as suggested by YGGDRASIL.
  79.  *       Formal redesign to add DDI debugging.
  80.  *       There are still flaws in IOCTL (workman with double speed drive).
  81.  *
  82.  *  1.0  Added support for all drive IDs (0...3, no longer only 0)
  83.  *       and up to 4 drives on one controller.
  84.  *       Added "#define MANY_SESSION" for "old" multi session CDs.
  85.  *
  86.  *  1.1  Do SpinUp for new drives, too.
  87.  *       Revised for clean compile under "old" kernels (0.99pl9).
  88.  *
  89.  *  1.2  Found the "workman with double-speed drive" bug: use the driver's
  90.  *       audio_state, not what the drive is reporting with ReadSubQ.
  91.  *
  92.  *  1.3  Minor cleanups.
  93.  *       Refinements regarding Workman.
  94.  *
  95.  *  1.4  Read XA disks (PhotoCDs) with "old" drives, too (but only the first
  96.  *       session - no chance to fully access a "multi-session" CD).
  97.  *       This currently still is too slow (50 kB/sec) - but possibly
  98.  *       the old drives won't do it faster.
  99.  *       Implemented "door (un)lock" for new drives (still does not work
  100.  *       as wanted - no lock possible after an unlock).
  101.  *       Added some debugging printout for the UPC/EAN code - but my drives 
  102.  *       return only zeroes. Is there no UPC/EAN code written?
  103.  *
  104.  *  1.5  Laborate with UPC/EAN code (not better yet).
  105.  *       Adapt to kernel 1.1.8 change (have to explicitly include
  106.  *       <linux/string.h> now).
  107.  *
  108.  *  1.6  Trying to read audio frames as data. Impossible with the current
  109.  *       drive firmware levels, as it seems. Awaiting any hint. ;-)
  110.  *       Changed "door unlock": repeat it until success.
  111.  *       Changed CDROMSTOP routine (stop somewhat "softer" so that Workman
  112.  *       won't get confused).
  113.  *       Added a third interface type: Sequoia S-1000, as used with the SPEA
  114.  *       Media FX sound card. This interface (usable for Sony and Mitsumi 
  115.  *       drives, too) needs a special configuration setup and behaves like a 
  116.  *       LaserMate type after that. Still experimental - I do not have such
  117.  *       an interface.
  118.  *       Use the "variable BLOCK_SIZE" feature (2048). But it does only work
  119.  *       if you give the mount option "block=2048".
  120.  *       The media_check routine is currently disabled; now that it gets
  121.  *       called as it should I fear it must get synchronized for not to
  122.  *       disturb the normal driver's activity.
  123.  *
  124.  *  2.0  Version number bumped - two reasons:
  125.  *       - reading audio tracks as data works now with CR-562 and CR-563. We
  126.  *       currently do it by an IOCTL (yet has to get standardized), one frame
  127.  *       at a time; that is pretty slow. But it works.
  128.  *       - we are maintaining now up to 4 interfaces (each up to 4 drives):
  129.  *       did it the easy way - a different MAJOR (25, 26, ...) and a different
  130.  *       copy of the driver (sbpcd.c, sbpcd2.c, sbpcd3.c, sbpcd4.c - only
  131.  *       distinguished by the value of SBPCD_ISSUE and the driver's name),
  132.  *       and a common sbpcd.h file.
  133.  *       Bettered the "ReadCapacity error" problem with old CR-52x drives (the
  134.  *       drives sometimes need a manual "eject/insert" before work): just
  135.  *       reset the drive and do again. Needs lots of resets here and sometimes
  136.  *       that does not cure, so this can't be the solution.
  137.  *
  138.  *  2.1  Found bug with multisession CDs (accessing frame 16).
  139.  *       "read audio" works now with address type CDROM_MSF, too.
  140.  *       Bigger audio frame buffer: allows reading max. 4 frames at time; this
  141.  *       gives a significant speedup, but reading more than one frame at once
  142.  *       gives missing chunks at each single frame boundary.
  143.  *
  144.  *  2.2  Kernel interface cleanups: timers, init, setup, media check.
  145.  *
  146.  *  2.3  Let "door lock" and "eject" live together.
  147.  *       Implemented "close tray" (done automatically during open).
  148.  *
  149.  *  2.4  Use different names for device registering.
  150.  *
  151.  *  2.5  Added "#if EJECT" code (default: enabled) to automatically eject
  152.  *       the tray during last call to "sbpcd_release".
  153.  *       Added "#if JUKEBOX" code (default: disabled) to automatically eject
  154.  *       the tray during call to "sbpcd_open" if no disk is in.
  155.  *       Turn on the CD volume of "compatible" sound cards, too; just define
  156.  *       SOUND_BASE (in sbpcd.h) accordingly (default: disabled).
  157.  *
  158.  *  2.6  Nothing new.  
  159.  *
  160.  *  2.7  Added CDROMEJECT_SW ioctl to set the "EJECT" behavior on the fly:
  161.  *       0 disables, 1 enables auto-ejecting. Useful to keep the tray in
  162.  *       during shutdown.
  163.  *
  164.  *  2.8  Added first support (still BETA, I need feedback or a drive) for
  165.  *       the Longshine LCS-7260 drives. They appear as double-speed drives
  166.  *       using the "old" command scheme, extended by tray control and door
  167.  *       lock functions.
  168.  *       Found (and fixed preliminary) a flaw with some multisession CDs: we
  169.  *       have to re-direct not only the accesses to frame 16 (the isofs
  170.  *       routines drive it up to max. 100), but also those to the continuation
  171.  *       (repetition) frames (as far as they exist - currently set fix as
  172.  *       16..20).
  173.  *       Changed default of the "JUKEBOX" define. If you use this default,
  174.  *       your tray will eject if you try to mount without a disk in. Next
  175.  *       mount command will insert the tray - so, just fill in a disk. ;-)
  176.  *
  177.  *  2.9  Fulfilled the Longshine LCS-7260 support; with great help and
  178.  *       experiments by Serge Robyns.
  179.  *       First attempts to support the TEAC CD-55A drives; but still not
  180.  *       usable yet.
  181.  *       Implemented the CDROMMULTISESSION ioctl; this is an attempt to handle
  182.  *       multi session CDs more "transparent" (redirection handling has to be
  183.  *       done within the isofs routines, and only for the special purpose of
  184.  *       obtaining the "right" volume descriptor; accesses to the raw device
  185.  *       should not get redirected).
  186.  *
  187.  *  3.0  Just a "normal" increment, with some provisions to do it better. ;-)
  188.  *       Introduced "#define READ_AUDIO" to specify the maximum number of 
  189.  *       audio frames to grab with one request. This defines a buffer size
  190.  *       within kernel space; a value of 0 will reserve no such space and
  191.  *       disable the CDROMREADAUDIO ioctl. A value of 75 enables the reading
  192.  *       of a whole second with one command, but will use a buffer of more
  193.  *       than 172 kB.
  194.  *       Started CD200 support. Drive detection should work, but nothing
  195.  *       more.
  196.  *
  197.  *  3.1  Working to support the CD200 and the Teac CD-55A drives.
  198.  *       AT-BUS style device numbering no longer used: use SCSI style now.
  199.  *       So, the first "found" device has MINOR 0, regardless of the
  200.  *       jumpered drive ID. This implies modifications to the /dev/sbpcd*
  201.  *       entries for some people, but will help the DAU (german TLA, english:
  202.  *       "newbie", maybe ;-) to install his "first" system from a CD.
  203.  *
  204.  *  3.2  Still testing with CD200 and CD-55A drives.
  205.  *
  206.  *  3.3  Working with CD200 support.
  207.  *
  208.  *  3.4  Auto-probing stops if an address of 0 is seen (to be entered with
  209.  *       the kernel command line).
  210.  *       Made the driver "loadable". If used as a module, "audio copy" is
  211.  *       disabled, and the internal read ahead data buffer has a reduced size
  212.  *       of 4 kB; so, throughput may be reduced a little bit with slow CPUs.
  213.  *
  214.  *  3.5  Provisions to handle weird photoCDs which have an interrupted
  215.  *       "formatting" immediately after the last frames of some files: simply
  216.  *       never "read ahead" with MultiSession CDs. By this, CPU usage may be
  217.  *       increased with those CDs, and there may be a loss in speed.
  218.  *       Re-structured the messaging system.
  219.  *       The "loadable" version no longer has a limited READ_AUDIO buffer
  220.  *       size.
  221.  *       Removed "MANY_SESSION" handling for "old" multi session CDs.
  222.  *       Added "private" IOCTLs CDROMRESET and CDROMVOLREAD.
  223.  *       Started again to support the TEAC CD-55A drives, now that I found
  224.  *       the money for "my own" drive. ;-)
  225.  *       The TEAC CD-55A support is fairly working now.
  226.  *       I have measured that the drive "delivers" at 600 kB/sec (even with
  227.  *       bigger requests than the drive's 64 kB buffer can satisfy), but
  228.  *       the "real" rate does not exceed 520 kB/sec at the moment. 
  229.  *       Caused by the various changes to build in TEAC support, the timed
  230.  *       loops are de-optimized at the moment (less throughput with CR-52x
  231.  *       drives, and the TEAC will give speed only with SBP_BUFFER_FRAMES 64).
  232.  *
  233.  *  3.6  Fixed TEAC data read problems with SbPro interfaces.
  234.  *       Initial size of the READ_AUDIO buffer is 0. Can get set to any size
  235.  *       during runtime.
  236.  *
  237.  *  3.7  Introduced MAX_DRIVES for some poor interface cards (seen with TEAC
  238.  *       drives) which allow only one drive (ID 0); this avoids repetitive
  239.  *       detection under IDs 1..3. 
  240.  *       Elongated cmd_out_T response waiting; necessary for photo CDs with
  241.  *       a lot of sessions.
  242.  *       Bettered the sbpcd_open() behavior with TEAC drives.
  243.  *
  244.  *  3.8  Elongated max_latency for CR-56x drives.
  245.  *
  246.  *  3.9  Finally fixed the long-known SoundScape/SPEA/Sequoia S-1000 interface
  247.  *       configuration bug.
  248.  *       Now Corey, Heiko, Ken, Leo, Vadim/Eric & Werner are invited to copy
  249.  *       the config_spea() routine into their drivers. ;-)
  250.  *
  251.  *  4.0  No "big step" - normal version increment.
  252.  *       Adapted the benefits from 1.3.33.
  253.  *       Fiddled with CDROMREADAUDIO flaws.
  254.  *       Avoid ReadCapacity command with CD200 drives (the MKE 1.01 version
  255.  *       seems not to support it).
  256.  *       Fulfilled "read audio" for CD200 drives, with help of Pete Heist
  257.  *       (heistp@rpi.edu).
  258.  *
  259.  *  4.1  Use loglevel KERN_INFO with printk().
  260.  *       Added support for "Vertos 100" drive ("ECS-AT") - it is very similar
  261.  *       to the Longshine LCS-7260. Give feedback if you can - I never saw
  262.  *       such a drive, and I have no specs.
  263.  *
  264.  *  4.2  Support for Teac 16-bit interface cards. Can't get auto-detected,
  265.  *       so you have to jumper your card to 0x2C0. Still not 100% - come
  266.  *       in contact if you can give qualified feedback.
  267.  *       Use loglevel KERN_NOTICE with printk(). If you get annoyed by a
  268.  *       flood of unwanted messages and the accompanied delay, try to read
  269.  *       my documentation. Especially the Linux CDROM drivers have to do an
  270.  *       important job for the newcomers, so the "distributed" version has
  271.  *       to fit some special needs. Since generations, the flood of messages
  272.  *       is user-configurable (even at runtime), but to get aware of this, one
  273.  *       needs a special mental quality: the ability to read.
  274.  *       
  275.  *  4.3  CD200F does not like to receive a command while the drive is
  276.  *       reading the ToC; still trying to solve it.
  277.  *       Removed some redundant verify_area calls (yes, Heiko Eissfeldt
  278.  *       is visiting all the Linux CDROM drivers ;-).
  279.  *       
  280.  *  4.4  Adapted one idea from tiensivu@pilot.msu.edu's "stripping-down"
  281.  *       experiments: "KLOGD_PAUSE".
  282.  *       Inhibited "play audio" attempts with data CDs. Provisions for a
  283.  *       "data-safe" handling of "mixed" (data plus audio) Cds.
  284.  *
  285.  *  4.5  Meanwhile Gonzalo Tornaria <tornaria@cmat.edu.uy> (GTL) built a
  286.  *       special end_request routine: we seem to have to take care for not
  287.  *       to have two processes working at the request list. My understanding
  288.  *       was and is that ll_rw_blk should not call do_sbpcd_request as long
  289.  *       as there is still one call active (the first call will care for all
  290.  *       outstanding I/Os, and if a second call happens, that is a bug in
  291.  *       ll_rw_blk.c).
  292.  *       "Check media change" without touching any drive.
  293.  *
  294.  *  4.6  Use a semaphore to synchronize multi-activity; elaborated by Rob
  295.  *       Riggs <rriggs@tesser.com>. At the moment, we simply block "read"
  296.  *       against "ioctl" and vice versa. This could be refined further, but
  297.  *       I guess with almost no performance increase.
  298.  *       Experiments to speed up the CD-55A; again with help of Rob Riggs
  299.  *       (to be true, he gave both, idea & code. ;-)
  300.  *
  301.  *  4.61 Ported to Uniform CD-ROM driver by 
  302.  *       Heiko Eissfeldt <heiko@colossus.escape.de> with additional
  303.  *       changes by Erik Andersen <andersee@debian.org>
  304.  *
  305.  *  4.62 Fix a bug where playing audio left the drive in an unusable state.
  306.  *         Heiko Eissfeldt <heiko@colossus.escape.de>
  307.  *
  308.  *  November 1999 -- Make kernel-parameter implementation work with 2.3.x 
  309.  *              Removed init_module & cleanup_module in favor of 
  310.  *              module_init & module_exit.
  311.  *              Torben Mathiasen <tmm@image.dk>
  312.  *
  313.  *  4.63 Bug fixes for audio annoyances, new legacy CDROM maintainer.
  314.  * Annoying things fixed:
  315.  * TOC reread on automated disk changes
  316.  * TOC reread on manual cd changes
  317.  * Play IOCTL tries to play CD before it's actually ready... sometimes.
  318.  * CD_AUDIO_COMPLETED state so workman (and other playes) can repeat play.
  319.  * Andrew J. Kroll <ag784@freenet.buffalo.edu> Wed Jul 26 04:24:10 EDT 2000
  320.  *
  321.  *  4.64 Fix module parameters - were being completely ignored.
  322.  *  Can also specify max_drives=N as a setup int to get rid of
  323.  *  "ghost" drives on crap hardware (aren't they all?)   Paul Gortmaker
  324.  *
  325.  *  TODO
  326.  *     implement "read all subchannel data" (96 bytes per frame)
  327.  *     remove alot of the virtual status bits and deal with hardware status
  328.  *     move the change of cd for audio to a better place
  329.  *     add debug levels to insmod parameters (trivial)
  330.  *
  331.  *     special thanks to Kai Makisara (kai.makisara@vtt.fi) for his fine
  332.  *     elaborated speed-up experiments (and the fabulous results!), for
  333.  *     the "push" towards load-free wait loops, and for the extensive mail
  334.  *     thread which brought additional hints and bug fixes.
  335.  *
  336.  */
  337. /*
  338.  * Trying to merge requests breaks this driver horribly (as in it goes
  339.  * boom and apparently has done so since 2.3.41).  As it is a legacy 
  340.  * driver for a horribly slow double speed CD on a hideous interface 
  341.  * designed for polled operation, I won't loose any sleep in simply 
  342.  * disallowing merging. Paul G.  02/2001
  343.  */
  344. #define DONT_MERGE_REQUESTS
  345. #ifndef SBPCD_ISSUE
  346. #define SBPCD_ISSUE 1
  347. #endif /* SBPCD_ISSUE */
  348. #include <linux/module.h>
  349. #include <linux/version.h>
  350. #include <linux/errno.h>
  351. #include <linux/sched.h>
  352. #include <linux/mm.h>
  353. #include <linux/timer.h>
  354. #include <linux/fs.h>
  355. #include <linux/kernel.h>
  356. #include <linux/cdrom.h>
  357. #include <linux/ioport.h>
  358. #include <linux/devfs_fs_kernel.h>
  359. #include <linux/major.h> 
  360. #include <linux/string.h>
  361. #include <linux/vmalloc.h>
  362. #include <linux/init.h>
  363. #include <linux/interrupt.h>
  364. #include <asm/system.h>
  365. #include <asm/io.h>
  366. #include <asm/uaccess.h>
  367. #include <stdarg.h>
  368. #include <linux/config.h>
  369. #include "sbpcd.h"
  370. #if !(SBPCD_ISSUE-1)
  371. #define MAJOR_NR MATSUSHITA_CDROM_MAJOR
  372. #endif
  373. #if !(SBPCD_ISSUE-2)
  374. #define MAJOR_NR MATSUSHITA_CDROM2_MAJOR /* second driver issue */
  375. #endif
  376. #if !(SBPCD_ISSUE-3)
  377. #define MAJOR_NR MATSUSHITA_CDROM3_MAJOR /* third driver issue */
  378. #endif
  379. #if !(SBPCD_ISSUE-4)
  380. #define MAJOR_NR MATSUSHITA_CDROM4_MAJOR /* fourth driver issue */
  381. #endif
  382. #include <linux/blk.h>
  383. /*==========================================================================*/
  384. /*
  385.  * provisions for more than 1 driver issues
  386.  * currently up to 4 drivers, expandable
  387.  */
  388. #if !(SBPCD_ISSUE-1)
  389. #define DO_SBPCD_REQUEST(a) do_sbpcd_request(a)
  390. #define SBPCD_INIT(a) sbpcd_init(a)
  391. #endif
  392. #if !(SBPCD_ISSUE-2)
  393. #define DO_SBPCD_REQUEST(a) do_sbpcd2_request(a)
  394. #define SBPCD_INIT(a) sbpcd2_init(a)
  395. #endif
  396. #if !(SBPCD_ISSUE-3)
  397. #define DO_SBPCD_REQUEST(a) do_sbpcd3_request(a)
  398. #define SBPCD_INIT(a) sbpcd3_init(a)
  399. #endif
  400. #if !(SBPCD_ISSUE-4)
  401. #define DO_SBPCD_REQUEST(a) do_sbpcd4_request(a)
  402. #define SBPCD_INIT(a) sbpcd4_init(a)
  403. #endif
  404. /*==========================================================================*/
  405. #if SBPCD_DIS_IRQ
  406. #define SBPCD_CLI cli()
  407. #define SBPCD_STI sti()
  408. #else
  409. #define SBPCD_CLI
  410. #define SBPCD_STI
  411. #endif /* SBPCD_DIS_IRQ */
  412. /*==========================================================================*/
  413. /*
  414.  * auto-probing address list
  415.  * inspired by Adam J. Richter from Yggdrasil
  416.  *
  417.  * still not good enough - can cause a hang.
  418.  *   example: a NE 2000 ethernet card at 300 will cause a hang probing 310.
  419.  * if that happens, reboot and use the LILO (kernel) command line.
  420.  * The possibly conflicting ethernet card addresses get NOT probed 
  421.  * by default - to minimize the hang possibilities. 
  422.  *
  423.  * The SB Pro addresses get "mirrored" at 0x6xx and some more locations - to
  424.  * avoid a type error, the 0x2xx-addresses must get checked before 0x6xx.
  425.  *
  426.  * send mail to emoenke@gwdg.de if your interface card is not FULLY
  427.  * represented here.
  428.  */
  429. #if !(SBPCD_ISSUE-1)
  430. static int sbpcd[] = 
  431. {
  432. CDROM_PORT, SBPRO, /* probe with user's setup first */
  433. #if DISTRIBUTION
  434. 0x230, 1, /* Soundblaster Pro and 16 (default) */
  435. #if 0
  436. 0x300, 0, /* CI-101P (default), WDH-7001C (default),
  437.      Galaxy (default), Reveal (one default) */
  438. 0x250, 1, /* OmniCD default, Soundblaster Pro and 16 */
  439. 0x2C0, 3, /* Teac 16-bit cards */
  440. 0x260, 1, /* OmniCD */
  441. 0x320, 0, /* Lasermate, CI-101P, WDH-7001C, Galaxy, Reveal (other default),
  442.      Longshine LCS-6853 (default) */
  443. 0x338, 0, /* Reveal Sound Wave 32 card model #SC600 */
  444. 0x340, 0, /* Mozart sound card (default), Lasermate, CI-101P */
  445. 0x360, 0, /* Lasermate, CI-101P */
  446. 0x270, 1, /* Soundblaster 16 */
  447. 0x670, 0, /* "sound card #9" */
  448. 0x690, 0, /* "sound card #9" */
  449. 0x338, 2, /* SPEA Media FX, Ensonic SoundScape (default) */
  450. 0x328, 2, /* SPEA Media FX */
  451. 0x348, 2, /* SPEA Media FX */
  452. 0x634, 0, /* some newer sound cards */
  453. 0x638, 0, /* some newer sound cards */
  454. 0x230, 1, /* some newer sound cards */
  455. /* due to incomplete address decoding of the SbPro card, these must be last */
  456. 0x630, 0, /* "sound card #9" (default) */
  457. 0x650, 0, /* "sound card #9" */
  458. #ifdef MODULE
  459. /*
  460.  * some "hazardous" locations (no harm with the loadable version)
  461.  * (will stop the bus if a NE2000 ethernet card resides at offset -0x10)
  462.  */
  463. 0x330, 0, /* Lasermate, CI-101P, WDH-7001C */
  464. 0x350, 0, /* Lasermate, CI-101P */
  465. 0x358, 2, /* SPEA Media FX */
  466. 0x370, 0, /* Lasermate, CI-101P */
  467. 0x290, 1, /* Soundblaster 16 */
  468. 0x310, 0, /* Lasermate, CI-101P, WDH-7001C */
  469. #endif /* MODULE */
  470. #endif
  471. #endif /* DISTRIBUTION */
  472. };
  473. #else
  474. static int sbpcd[] = {CDROM_PORT, SBPRO}; /* probe with user's setup only */
  475. #endif
  476. MODULE_PARM(sbpcd, "2i");
  477. MODULE_PARM(max_drives, "i");
  478. #define NUM_PROBE  (sizeof(sbpcd) / sizeof(int))
  479. /*==========================================================================*/
  480. /*
  481.  * the external references:
  482.  */
  483. #if !(SBPCD_ISSUE-1)
  484. #ifdef CONFIG_SBPCD2
  485. extern int sbpcd2_init(void);
  486. #endif
  487. #ifdef CONFIG_SBPCD3
  488. extern int sbpcd3_init(void);
  489. #endif
  490. #ifdef CONFIG_SBPCD4
  491. extern int sbpcd4_init(void);
  492. #endif
  493. #endif
  494. /*==========================================================================*/
  495. #define INLINE inline
  496. /*==========================================================================*/
  497. /*
  498.  * the forward references:
  499.  */
  500. static void sbp_sleep(u_int);
  501. static void mark_timeout_delay(u_long);
  502. static void mark_timeout_data(u_long);
  503. #if 0
  504. static void mark_timeout_audio(u_long);
  505. #endif
  506. static void sbp_read_cmd(struct request *req);
  507. static int sbp_data(struct request *req);
  508. static int cmd_out(void);
  509. static int DiskInfo(void);
  510. static int sbpcd_chk_disk_change(kdev_t);
  511. /*==========================================================================*/
  512. /*
  513.  * pattern for printk selection:
  514.  *
  515.  * (1<<DBG_INF)  necessary information
  516.  * (1<<DBG_BSZ)  BLOCK_SIZE trace
  517.  * (1<<DBG_REA)  "read" status trace
  518.  * (1<<DBG_CHK)  "media check" trace
  519.  * (1<<DBG_TIM)  datarate timer test
  520.  * (1<<DBG_INI)  initialization trace
  521.  * (1<<DBG_TOC)  tell TocEntry values
  522.  * (1<<DBG_IOC)  ioctl trace
  523.  * (1<<DBG_STA)  "ResponseStatus" trace
  524.  * (1<<DBG_ERR)  "cc_ReadError" trace
  525.  * (1<<DBG_CMD)  "cmd_out" trace
  526.  * (1<<DBG_WRN)  give explanation before auto-probing
  527.  * (1<<DBG_MUL)  multi session code test
  528.  * (1<<DBG_IDX)  "drive_id != 0" test code
  529.  * (1<<DBG_IOX)  some special information
  530.  * (1<<DBG_DID)  drive ID test
  531.  * (1<<DBG_RES)  drive reset info
  532.  * (1<<DBG_SPI)  SpinUp test info
  533.  * (1<<DBG_IOS)  ioctl trace: "subchannel"
  534.  * (1<<DBG_IO2)  ioctl trace: general
  535.  * (1<<DBG_UPC)  show UPC info
  536.  * (1<<DBG_XA1)  XA mode debugging
  537.  * (1<<DBG_LCK)  door (un)lock info
  538.  * (1<<DBG_SQ1)   dump SubQ frame
  539.  * (1<<DBG_AUD)  "read audio" debugging
  540.  * (1<<DBG_SEQ)  Sequoia interface configuration trace
  541.  * (1<<DBG_LCS)  Longshine LCS-7260 debugging trace
  542.  * (1<<DBG_CD2)  MKE/Funai CD200 debugging trace
  543.  * (1<<DBG_TEA)  TEAC CD-55A debugging trace
  544.  * (1<<DBG_ECS)  ECS-AT (Vertos-100) debugging trace
  545.  * (1<<DBG_000)  unnecessary information
  546.  */
  547. #if DISTRIBUTION
  548. static int sbpcd_debug = (1<<DBG_INF);
  549. #else
  550. static int sbpcd_debug = 0 & ((1<<DBG_INF) |
  551.   (1<<DBG_TOC) |
  552.   (1<<DBG_MUL) |
  553.   (1<<DBG_UPC));
  554. #endif /* DISTRIBUTION */
  555. static int sbpcd_ioaddr = CDROM_PORT; /* default I/O base address */
  556. static int sbpro_type = SBPRO;
  557. static unsigned char f_16bit;
  558. static unsigned char do_16bit;
  559. static int CDo_command, CDo_reset;
  560. static int CDo_sel_i_d, CDo_enable;
  561. static int CDi_info, CDi_status, CDi_data;
  562. static struct cdrom_msf msf;
  563. static struct cdrom_ti ti;
  564. static struct cdrom_tochdr tochdr;
  565. static struct cdrom_tocentry tocentry;
  566. static struct cdrom_subchnl SC;
  567. static struct cdrom_volctrl volctrl;
  568. static struct cdrom_read_audio read_audio;
  569. static unsigned char msgnum;
  570. static char msgbuf[80];
  571. static int max_drives = MAX_DRIVES;
  572. #ifndef MODULE
  573. static unsigned char setup_done;
  574. static const char *str_sb_l = "soundblaster";
  575. static const char *str_sp_l = "spea";
  576. static const char *str_ss_l = "soundscape";
  577. static const char *str_t16_l = "teac16bit";
  578. static const char *str_ss = "SoundScape";
  579. #endif
  580. static const char *str_sb = "SoundBlaster";
  581. static const char *str_lm = "LaserMate";
  582. static const char *str_sp = "SPEA";
  583. static const char *str_t16 = "Teac16bit";
  584. static const char *type;
  585. #if !(SBPCD_ISSUE-1)
  586. static const char *major_name="sbpcd";
  587. #endif
  588. #if !(SBPCD_ISSUE-2)
  589. static const char *major_name="sbpcd2";
  590. #endif
  591. #if !(SBPCD_ISSUE-3)
  592. static const char *major_name="sbpcd3";
  593. #endif
  594. #if !(SBPCD_ISSUE-4)
  595. static const char *major_name="sbpcd4";
  596. #endif
  597. /*==========================================================================*/
  598. #if FUTURE
  599. static DECLARE_WAIT_QUEUE_HEAD(sbp_waitq);
  600. #endif /* FUTURE */
  601. static int teac=SBP_TEAC_SPEED;
  602. static int buffers=SBP_BUFFER_FRAMES;
  603. static u_char family0[]="MATSHITA"; /* MKE CR-521, CR-522, CR-523 */
  604. static u_char family1[]="CR-56";    /* MKE CR-562, CR-563 */
  605. static u_char family2[]="CD200";    /* MKE CD200, Funai CD200F */
  606. static u_char familyL[]="LCS-7260"; /* Longshine LCS-7260 */
  607. static u_char familyT[]="CD-55";    /* TEAC CD-55A */
  608. static u_char familyV[]="ECS-AT";   /* ECS Vertos 100 */
  609. static u_int recursion; /* internal testing only */
  610. static u_int fatal_err; /* internal testing only */
  611. static u_int response_count;
  612. static u_int flags_cmd_out;
  613. static u_char cmd_type;
  614. static u_char drvcmd[10];
  615. static u_char infobuf[20];
  616. static u_char xa_head_buf[CD_XA_HEAD];
  617. static u_char xa_tail_buf[CD_XA_TAIL];
  618. #if OLD_BUSY
  619. static volatile u_char busy_data;
  620. static volatile u_char busy_audio; /* true semaphores would be safer */
  621. #endif /* OLD_BUSY */ 
  622. static DECLARE_MUTEX(ioctl_read_sem);
  623. static u_long timeout;
  624. static volatile u_char timed_out_delay;
  625. static volatile u_char timed_out_data;
  626. #if 0
  627. static volatile u_char timed_out_audio;
  628. #endif
  629. static u_int datarate= 1000000;
  630. static u_int maxtim16=16000000;
  631. static u_int maxtim04= 4000000;
  632. static u_int maxtim02= 2000000;
  633. static u_int maxtim_8=   30000;
  634. #if LONG_TIMING
  635. static u_int maxtim_data= 9000;
  636. #else
  637. static u_int maxtim_data= 3000;
  638. #endif /* LONG_TIMING */ 
  639. #if DISTRIBUTION
  640. static int n_retries=6;
  641. #else
  642. static int n_retries=6;
  643. #endif
  644. /*==========================================================================*/
  645. static int ndrives;
  646. static u_char drv_pattern[NR_SBPCD]={speed_auto,speed_auto,speed_auto,speed_auto};
  647. static int sbpcd_blocksizes[NR_SBPCD];
  648. /*==========================================================================*/
  649. /*
  650.  * drive space begins here (needed separate for each unit) 
  651.  */
  652. static int d; /* DriveStruct index: drive number */
  653. static struct {
  654. char drv_id;           /* "jumpered" drive ID or -1 */
  655. char drv_sel;          /* drive select lines bits */
  656. char drive_model[9];
  657. u_char firmware_version[4];
  658. char f_eject;          /* auto-eject flag: 0 or 1 */
  659. u_char *sbp_buf;       /* Pointer to internal data buffer,
  660.   space allocated during sbpcd_init() */
  661. u_int sbp_bufsiz;      /* size of sbp_buf (# of frames) */
  662. int sbp_first_frame;   /* First frame in buffer */
  663. int sbp_last_frame;    /* Last frame in buffer  */
  664. int sbp_read_frames;   /* Number of frames being read to buffer */
  665. int sbp_current;       /* Frame being currently read */
  666. u_char mode;           /* read_mode: READ_M1, READ_M2, READ_SC, READ_AU */
  667. u_char *aud_buf;       /* Pointer to audio data buffer,
  668.   space allocated during sbpcd_init() */
  669. u_int sbp_audsiz;      /* size of aud_buf (# of raw frames) */
  670. u_int drv_type;
  671. u_char drv_options;
  672. int status_bits;
  673. u_char diskstate_flags;
  674. u_char sense_byte;
  675. u_char CD_changed;
  676. char open_count;
  677. u_char error_byte;
  678. u_char f_multisession;
  679. u_int lba_multi;
  680. int first_session;
  681. int last_session;
  682. int track_of_last_session;
  683. u_char audio_state;
  684. u_int pos_audio_start;
  685. u_int pos_audio_end;
  686. char vol_chan0;
  687. u_char vol_ctrl0;
  688. char vol_chan1;
  689. u_char vol_ctrl1;
  690. #if 000 /* no supported drive has it */
  691. char vol_chan2;
  692. u_char vol_ctrl2;
  693. char vol_chan3;
  694. u_char vol_ctrl3;
  695. #endif /*000 */
  696. u_char volume_control; /* TEAC on/off bits */
  697. u_char SubQ_ctl_adr;
  698. u_char SubQ_trk;
  699. u_char SubQ_pnt_idx;
  700. u_int SubQ_run_tot;
  701. u_int SubQ_run_trk;
  702. u_char SubQ_whatisthis;
  703. u_char UPC_ctl_adr;
  704. u_char UPC_buf[7];
  705. int frame_size;
  706. int CDsize_frm;
  707. u_char xa_byte; /* 0x20: XA capabilities */
  708. u_char n_first_track; /* binary */
  709. u_char n_last_track; /* binary (not bcd), 0x01...0x63 */
  710. u_int size_msf; /* time of whole CD, position of LeadOut track */
  711. u_int size_blk;
  712. u_char TocEnt_nixbyte; /* em */
  713. u_char TocEnt_ctl_adr;
  714. u_char TocEnt_number;
  715. u_char TocEnt_format; /* em */
  716. u_int TocEnt_address;
  717. #if SAFE_MIXED
  718. char has_data;
  719. #endif /* SAFE_MIXED */ 
  720. u_char ored_ctl_adr; /* to detect if CDROM contains data tracks */
  721. struct {
  722. u_char nixbyte; /* em */
  723. u_char ctl_adr; /* 0x4x: data, 0x0x: audio */
  724. u_char number;
  725. u_char format; /* em */ /* 0x00: lba, 0x01: msf */
  726. u_int address;
  727. } TocBuffer[MAX_TRACKS+1]; /* last entry faked */ 
  728. int in_SpinUp; /* CR-52x test flag */
  729. int n_bytes; /* TEAC awaited response count */
  730. u_char error_state, b3, b4; /* TEAC command error state */
  731. u_char f_drv_error; /* TEAC command error flag */
  732. u_char speed_byte;
  733. int frmsiz;
  734. u_char f_XA; /* 1: XA */
  735. u_char type_byte; /* 0, 1, 3 */
  736. u_char mode_xb_6;
  737. u_char mode_yb_7;
  738. u_char mode_xb_8;
  739. u_char delay;
  740. struct cdrom_device_info *sbpcd_infop;
  741. } D_S[NR_SBPCD];
  742. /*
  743.  * drive space ends here (needed separate for each unit)
  744.  */
  745. /*==========================================================================*/
  746. #if 0
  747. unsigned long cli_sti; /* for saving the processor flags */
  748. #endif
  749. /*==========================================================================*/
  750. static struct timer_list delay_timer = { function: mark_timeout_delay};
  751. static struct timer_list data_timer = { function: mark_timeout_data};
  752. #if 0
  753. static struct timer_list audio_timer = { function: mark_timeout_audio};
  754. #endif
  755. /*==========================================================================*/
  756. /*
  757.  * DDI interface
  758.  */
  759. static void msg(int level, const char *fmt, ...)
  760. {
  761. #if DISTRIBUTION
  762. #define MSG_LEVEL KERN_NOTICE
  763. #else
  764. #define MSG_LEVEL KERN_INFO
  765. #endif /* DISTRIBUTION */
  766. char buf[256];
  767. va_list args;
  768. if (!(sbpcd_debug&(1<<level))) return;
  769. msgnum++;
  770. if (msgnum>99) msgnum=0;
  771. sprintf(buf, MSG_LEVEL "%s-%d [%02d]:  ", major_name, d, msgnum);
  772. va_start(args, fmt);
  773. vsprintf(&buf[18], fmt, args);
  774. va_end(args);
  775. printk(buf);
  776. #if KLOGD_PAUSE
  777. sbp_sleep(KLOGD_PAUSE); /* else messages get lost */
  778. #endif /* KLOGD_PAUSE */ 
  779. return;
  780. }
  781. /*==========================================================================*/
  782. /*
  783.  * DDI interface: runtime trace bit pattern maintenance
  784.  */
  785. static int sbpcd_dbg_ioctl(unsigned long arg, int level)
  786. {
  787. switch(arg)
  788. {
  789. case 0: /* OFF */
  790. sbpcd_debug = DBG_INF;
  791. break;
  792. default:
  793. if (arg>=128) sbpcd_debug &= ~(1<<(arg-128));
  794. else sbpcd_debug |= (1<<arg);
  795. }
  796. return (arg);
  797. }
  798. /*==========================================================================*/
  799. static void mark_timeout_delay(u_long i)
  800. {
  801. timed_out_delay=1;
  802. #if 0
  803. msg(DBG_TIM,"delay timer expired.n");
  804. #endif
  805. }
  806. /*==========================================================================*/
  807. static void mark_timeout_data(u_long i)
  808. {
  809. timed_out_data=1;
  810. #if 0
  811. msg(DBG_TIM,"data timer expired.n");
  812. #endif
  813. }
  814. /*==========================================================================*/
  815. #if 0
  816. static void mark_timeout_audio(u_long i)
  817. {
  818. timed_out_audio=1;
  819. #if 0
  820. msg(DBG_TIM,"audio timer expired.n");
  821. #endif
  822. }
  823. #endif
  824. /*==========================================================================*/
  825. /*
  826.  * Wait a little while (used for polling the drive).
  827.  */
  828. static void sbp_sleep(u_int time)
  829. {
  830. sti();
  831. current->state = TASK_INTERRUPTIBLE;
  832. schedule_timeout(time);
  833. sti();
  834. }
  835. /*==========================================================================*/
  836. #define RETURN_UP(rc) {up(&ioctl_read_sem); return(rc);}
  837. /*==========================================================================*/
  838. /*
  839.  *  convert logical_block_address to m-s-f_number (3 bytes only)
  840.  */
  841. static INLINE void lba2msf(int lba, u_char *msf)
  842. {
  843. lba += CD_MSF_OFFSET;
  844. msf[0] = lba / (CD_SECS*CD_FRAMES);
  845. lba %= CD_SECS*CD_FRAMES;
  846. msf[1] = lba / CD_FRAMES;
  847. msf[2] = lba % CD_FRAMES;
  848. }
  849. /*==========================================================================*/
  850. /*==========================================================================*/
  851. /*
  852.  *  convert msf-bin to msf-bcd
  853.  */
  854. static INLINE void bin2bcdx(u_char *p)  /* must work only up to 75 or 99 */
  855. {
  856. *p=((*p/10)<<4)|(*p%10);
  857. }
  858. /*==========================================================================*/
  859. static INLINE u_int blk2msf(u_int blk)
  860. {
  861. MSF msf;
  862. u_int mm;
  863. msf.c[3] = 0;
  864. msf.c[2] = (blk + CD_MSF_OFFSET) / (CD_SECS * CD_FRAMES);
  865. mm = (blk + CD_MSF_OFFSET) % (CD_SECS * CD_FRAMES);
  866. msf.c[1] = mm / CD_FRAMES;
  867. msf.c[0] = mm % CD_FRAMES;
  868. return (msf.n);
  869. }
  870. /*==========================================================================*/
  871. static INLINE u_int make16(u_char rh, u_char rl)
  872. {
  873. return ((rh<<8)|rl);
  874. }
  875. /*==========================================================================*/
  876. static INLINE u_int make32(u_int rh, u_int rl)
  877. {
  878. return ((rh<<16)|rl);
  879. }
  880. /*==========================================================================*/
  881. static INLINE u_char swap_nibbles(u_char i)
  882. {
  883. return ((i<<4)|(i>>4));
  884. }
  885. /*==========================================================================*/
  886. static INLINE u_char byt2bcd(u_char i)
  887. {
  888. return (((i/10)<<4)+i%10);
  889. }
  890. /*==========================================================================*/
  891. static INLINE u_char bcd2bin(u_char bcd)
  892. {
  893. return ((bcd>>4)*10+(bcd&0x0F));
  894. }
  895. /*==========================================================================*/
  896. static INLINE int msf2blk(int msfx)
  897. {
  898. MSF msf;
  899. int i;
  900. msf.n=msfx;
  901. i=(msf.c[2] * CD_SECS + msf.c[1]) * CD_FRAMES + msf.c[0] - CD_MSF_OFFSET;
  902. if (i<0) return (0);
  903. return (i);
  904. }
  905. /*==========================================================================*/
  906. /*
  907.  *  convert m-s-f_number (3 bytes only) to logical_block_address 
  908.  */
  909. static INLINE int msf2lba(u_char *msf)
  910. {
  911. int i;
  912. i=(msf[0] * CD_SECS + msf[1]) * CD_FRAMES + msf[2] - CD_MSF_OFFSET;
  913. if (i<0) return (0);
  914. return (i);
  915. }
  916. /*==========================================================================*/
  917. /* evaluate cc_ReadError code */ 
  918. static int sta2err(int sta)
  919. {
  920. if (famT_drive)
  921. {
  922. if (sta==0x00) return (0);
  923. if (sta==0x01) return (-604); /* CRC error */
  924. if (sta==0x02) return (-602); /* drive not ready */
  925. if (sta==0x03) return (-607); /* unknown media */
  926. if (sta==0x04) return (-612); /* general failure */
  927. if (sta==0x05) return (0);
  928. if (sta==0x06) return (-ERR_DISKCHANGE); /* disk change */
  929. if (sta==0x0b) return (-612); /* general failure */
  930. if (sta==0xff) return (-612); /* general failure */
  931. return (0);
  932. }
  933. else
  934. {
  935. if (sta<=2) return (sta);
  936. if (sta==0x05) return (-604); /* CRC error */
  937. if (sta==0x06) return (-606); /* seek error */
  938. if (sta==0x0d) return (-606); /* seek error */
  939. if (sta==0x0e) return (-603); /* unknown command */
  940. if (sta==0x14) return (-603); /* unknown command */
  941. if (sta==0x0c) return (-611); /* read fault */
  942. if (sta==0x0f) return (-611); /* read fault */
  943. if (sta==0x10) return (-611); /* read fault */
  944. if (sta>=0x16) return (-612); /* general failure */
  945. if (sta==0x11) return (-ERR_DISKCHANGE); /* disk change (LCS: removed) */
  946. if (famL_drive)
  947. if (sta==0x12) return (-ERR_DISKCHANGE); /* disk change (inserted) */
  948. return (-602); /* drive not ready */
  949. }
  950. }
  951. /*==========================================================================*/
  952. static INLINE void clr_cmdbuf(void)
  953. {
  954. int i;
  955. for (i=0;i<10;i++) drvcmd[i]=0;
  956. cmd_type=0;
  957. }
  958. /*==========================================================================*/
  959. static void flush_status(void)
  960. {
  961. int i;
  962. sbp_sleep(15*HZ/10);
  963. for (i=maxtim_data;i!=0;i--) inb(CDi_status);
  964. }
  965. /*====================================================================*/
  966. /*
  967.  * CDi status loop for Teac CD-55A (Rob Riggs)
  968.  *
  969.  * This is needed because for some strange reason
  970.  * the CD-55A can take a real long time to give a
  971.  * status response. This seems to happen after we
  972.  * issue a READ command where a long seek is involved.
  973.  *
  974.  * I tried to ensure that we get max throughput with
  975.  * minimal busy waiting. We busy wait at first, then
  976.  * "switch gears" and start sleeping. We sleep for
  977.  * longer periods of time the longer we wait.
  978.  *
  979.  */
  980. static int CDi_stat_loop_T(void)
  981. {
  982. int i, gear=1;
  983. u_long  timeout_1, timeout_2, timeout_3, timeout_4;
  984. timeout_1 = jiffies + HZ / 50;  /* sbp_sleep(0) for a short period */
  985. timeout_2 = jiffies + HZ / 5; /* nap for no more than 200ms */
  986. timeout_3 = jiffies + 5 * HZ; /* sleep for up to 5s */
  987. timeout_4 = jiffies + 45 * HZ; /* long sleep for up to 45s. */
  988. do
  989.           {
  990.             i = inb(CDi_status);
  991.             if (!(i&s_not_data_ready)) return (i);
  992.             if (!(i&s_not_result_ready)) return (i);
  993.             switch(gear)
  994.               {
  995.               case 4:
  996.                 sbp_sleep(HZ);
  997.                 if (time_after(jiffies, timeout_4)) gear++;
  998.                 msg(DBG_TEA, "CDi_stat_loop_T: long sleep active.n");
  999.                 break;
  1000.               case 3:
  1001.                 sbp_sleep(HZ/10);
  1002.                 if (time_after(jiffies, timeout_3)) gear++;
  1003.                 break;
  1004.               case 2:
  1005.                 sbp_sleep(HZ/100);
  1006.                 if (time_after(jiffies, timeout_2)) gear++;
  1007.                 break;
  1008.               case 1:
  1009.                 sbp_sleep(0);
  1010.                 if (time_after(jiffies, timeout_1)) gear++;
  1011.               }
  1012.           } while (gear < 5);
  1013. return -1;
  1014. }
  1015. /*==========================================================================*/
  1016. static int CDi_stat_loop(void)
  1017. {
  1018. int i,j;
  1019. for(timeout = jiffies + 10*HZ, i=maxtim_data; time_before(jiffies, timeout); )
  1020. {
  1021. for ( ;i!=0;i--)
  1022. {
  1023. j=inb(CDi_status);
  1024. if (!(j&s_not_data_ready)) return (j);
  1025. if (!(j&s_not_result_ready)) return (j);
  1026. if (fam0L_drive) if (j&s_attention) return (j);
  1027. }
  1028. sbp_sleep(1);
  1029. i = 1;
  1030. }
  1031. msg(DBG_LCS,"CDi_stat_loop failed in line %dn", __LINE__);
  1032. return (-1);
  1033. }
  1034. /*==========================================================================*/
  1035. #if 00000
  1036. /*==========================================================================*/
  1037. static int tst_DataReady(void)
  1038. {
  1039. int i;
  1040. i=inb(CDi_status);
  1041. if (i&s_not_data_ready) return (0);
  1042. return (1);
  1043. }
  1044. /*==========================================================================*/
  1045. static int tst_ResultReady(void)
  1046. {
  1047. int i;
  1048. i=inb(CDi_status);
  1049. if (i&s_not_result_ready) return (0);
  1050. return (1);
  1051. }
  1052. /*==========================================================================*/
  1053. static int tst_Attention(void)
  1054. {
  1055. int i;
  1056. i=inb(CDi_status);
  1057. if (i&s_attention) return (1);
  1058. return (0);
  1059. }
  1060. /*==========================================================================*/
  1061. #endif
  1062. /*==========================================================================*/
  1063. static int ResponseInfo(void)
  1064. {
  1065. int i,j,st=0;
  1066. u_long timeout;
  1067. for (i=0,timeout=jiffies+HZ;i<response_count;i++) 
  1068. {
  1069. for (j=maxtim_data; ; )
  1070. {
  1071. for ( ;j!=0;j-- )
  1072. {
  1073. st=inb(CDi_status);
  1074. if (!(st&s_not_result_ready)) break;
  1075. }
  1076. if ((j!=0)||time_after_eq(jiffies, timeout)) break;
  1077. sbp_sleep(1);
  1078. j = 1;
  1079. }
  1080. if (time_after_eq(jiffies, timeout)) break;
  1081. infobuf[i]=inb(CDi_info);
  1082. }
  1083. #if 000
  1084. while (!(inb(CDi_status)&s_not_result_ready))
  1085. {
  1086. infobuf[i++]=inb(CDi_info);
  1087. }
  1088. j=i-response_count;
  1089. if (j>0) msg(DBG_INF,"ResponseInfo: got %d trailing bytes.n",j);
  1090. #endif /* 000 */
  1091. for (j=0;j<i;j++)
  1092. sprintf(&msgbuf[j*3]," %02X",infobuf[j]);
  1093. msgbuf[j*3]=0;
  1094. msg(DBG_CMD,"ResponseInfo:%s (%d,%d)n",msgbuf,response_count,i);
  1095. j=response_count-i;
  1096. if (j>0) return (-j);
  1097. else return (i);
  1098. }
  1099. /*==========================================================================*/
  1100. static void EvaluateStatus(int st)
  1101. {
  1102. D_S[d].status_bits=0;
  1103. if (fam1_drive) D_S[d].status_bits=st|p_success;
  1104. else if (fam0_drive)
  1105. {
  1106. if (st&p_caddin_old) D_S[d].status_bits |= p_door_closed|p_caddy_in;
  1107. if (st&p_spinning) D_S[d].status_bits |= p_spinning;
  1108. if (st&p_check) D_S[d].status_bits |= p_check;
  1109.   if (st&p_success_old) D_S[d].status_bits |= p_success;
  1110.   if (st&p_busy_old) D_S[d].status_bits |= p_busy_new;
  1111. if (st&p_disk_ok) D_S[d].status_bits |= p_disk_ok;
  1112. }
  1113. else if (famLV_drive)
  1114. {
  1115.   D_S[d].status_bits |= p_success;
  1116. if (st&p_caddin_old) D_S[d].status_bits |= p_disk_ok|p_caddy_in;
  1117. if (st&p_spinning) D_S[d].status_bits |= p_spinning;
  1118. if (st&p_check) D_S[d].status_bits |= p_check;
  1119. if (st&p_busy_old) D_S[d].status_bits |= p_busy_new;
  1120. if (st&p_lcs_door_closed) D_S[d].status_bits |= p_door_closed;
  1121. if (st&p_lcs_door_locked) D_S[d].status_bits |= p_door_locked;
  1122. }
  1123. else if (fam2_drive)
  1124. {
  1125.   D_S[d].status_bits |= p_success;
  1126. if (st&p2_check) D_S[d].status_bits |= p1_check;
  1127. if (st&p2_door_closed) D_S[d].status_bits |= p1_door_closed;
  1128. if (st&p2_disk_in) D_S[d].status_bits |= p1_disk_in;
  1129. if (st&p2_busy1) D_S[d].status_bits |= p1_busy;
  1130. if (st&p2_busy2) D_S[d].status_bits |= p1_busy;
  1131. if (st&p2_spinning) D_S[d].status_bits |= p1_spinning;
  1132. if (st&p2_door_locked) D_S[d].status_bits |= p1_door_locked;
  1133. if (st&p2_disk_ok) D_S[d].status_bits |= p1_disk_ok;
  1134. }
  1135. else if (famT_drive)
  1136. {
  1137. return; /* still needs to get coded */
  1138.   D_S[d].status_bits |= p_success;
  1139. if (st&p2_check) D_S[d].status_bits |= p1_check;
  1140. if (st&p2_door_closed) D_S[d].status_bits |= p1_door_closed;
  1141. if (st&p2_disk_in) D_S[d].status_bits |= p1_disk_in;
  1142. if (st&p2_busy1) D_S[d].status_bits |= p1_busy;
  1143. if (st&p2_busy2) D_S[d].status_bits |= p1_busy;
  1144. if (st&p2_spinning) D_S[d].status_bits |= p1_spinning;
  1145. if (st&p2_door_locked) D_S[d].status_bits |= p1_door_locked;
  1146. if (st&p2_disk_ok) D_S[d].status_bits |= p1_disk_ok;
  1147. }
  1148. return;
  1149. }
  1150. /*==========================================================================*/
  1151. static int get_state_T(void)
  1152. {
  1153. int i;
  1154. static int cmd_out_T(void);
  1155. clr_cmdbuf();
  1156. D_S[d].n_bytes=1;
  1157. drvcmd[0]=CMDT_STATUS;
  1158. i=cmd_out_T();
  1159. if (i>=0) i=infobuf[0];
  1160. else
  1161. {
  1162. msg(DBG_TEA,"get_state_T error %dn", i);
  1163. return (i);
  1164. }
  1165. if (i>=0)
  1166. /* 2: closed, disk in */
  1167. D_S[d].status_bits=p1_door_closed|p1_disk_in|p1_spinning|p1_disk_ok;
  1168. else if (D_S[d].error_state==6)
  1169. {
  1170. /* 3: closed, disk in, changed ("06 xx xx") */
  1171. D_S[d].status_bits=p1_door_closed|p1_disk_in;
  1172. D_S[d].CD_changed=0xFF;
  1173. D_S[d].diskstate_flags &= ~toc_bit;
  1174. }
  1175. else if ((D_S[d].error_state!=2)||(D_S[d].b3!=0x3A)||(D_S[d].b4==0x00))
  1176. {
  1177. /* 1: closed, no disk ("xx yy zz"or "02 3A 00") */
  1178. D_S[d].status_bits=p1_door_closed;
  1179. D_S[d].open_count=0;
  1180. }
  1181. else if (D_S[d].b4==0x01)
  1182. {
  1183. /* 0: open ("02 3A 01") */
  1184. D_S[d].status_bits=0;
  1185. D_S[d].open_count=0;
  1186. }
  1187. else
  1188. {
  1189. /* 1: closed, no disk ("02 3A xx") */
  1190. D_S[d].status_bits=p1_door_closed;
  1191. D_S[d].open_count=0;
  1192. }
  1193. return (D_S[d].status_bits);
  1194. }
  1195. /*==========================================================================*/
  1196. static int ResponseStatus(void)
  1197. {
  1198. int i,j;
  1199. u_long timeout;
  1200. msg(DBG_STA,"doing ResponseStatus...n");
  1201. if (famT_drive) return (get_state_T());
  1202. if (flags_cmd_out & f_respo3) timeout = jiffies;
  1203. else if (flags_cmd_out & f_respo2) timeout = jiffies + 16*HZ;
  1204. else timeout = jiffies + 4*HZ;
  1205. j=maxtim_8;
  1206. do
  1207. {
  1208. for ( ;j!=0;j--)
  1209. i=inb(CDi_status);
  1210. if (!(i&s_not_result_ready)) break;
  1211. }
  1212. if ((j!=0)||time_after(jiffies, timeout)) break;
  1213. sbp_sleep(1);
  1214. j = 1;
  1215. }
  1216. while (1);
  1217. if (j==0) 
  1218. {
  1219. if ((flags_cmd_out & f_respo3) == 0)
  1220. msg(DBG_STA,"ResponseStatus: timeout.n");
  1221. D_S[d].status_bits=0;
  1222. return (-401);
  1223. }
  1224. i=inb(CDi_info);
  1225. msg(DBG_STA,"ResponseStatus: response %02X.n", i);
  1226. EvaluateStatus(i);
  1227. msg(DBG_STA,"status_bits=%02X, i=%02Xn",D_S[d].status_bits,i);
  1228. return (D_S[d].status_bits);
  1229. }
  1230. /*==========================================================================*/
  1231. static void cc_ReadStatus(void)
  1232. {
  1233. int i;
  1234. msg(DBG_STA,"giving cc_ReadStatus commandn");
  1235. if (famT_drive) return;
  1236. SBPCD_CLI;
  1237. if (fam0LV_drive) OUT(CDo_command,CMD0_STATUS);
  1238. else if (fam1_drive) OUT(CDo_command,CMD1_STATUS);
  1239. else if (fam2_drive) OUT(CDo_command,CMD2_STATUS);
  1240. if (!fam0LV_drive) for (i=0;i<6;i++) OUT(CDo_command,0);
  1241. SBPCD_STI;
  1242. }
  1243. /*==========================================================================*/
  1244. static int cc_ReadError(void)
  1245. {
  1246. int i;
  1247. clr_cmdbuf();
  1248. msg(DBG_ERR,"giving cc_ReadError command.n");
  1249. if (fam1_drive)
  1250. {
  1251. drvcmd[0]=CMD1_READ_ERR;
  1252. response_count=8;
  1253. flags_cmd_out=f_putcmd|f_ResponseStatus;
  1254. }
  1255. else if (fam0LV_drive)
  1256. {
  1257. drvcmd[0]=CMD0_READ_ERR;
  1258. response_count=6;
  1259. if (famLV_drive)
  1260. flags_cmd_out=f_putcmd;
  1261. else
  1262. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus;
  1263. }
  1264. else if (fam2_drive)
  1265. {
  1266. drvcmd[0]=CMD2_READ_ERR;
  1267. response_count=6;
  1268. flags_cmd_out=f_putcmd;
  1269. }
  1270. else if (famT_drive)
  1271. {
  1272. response_count=5;
  1273. drvcmd[0]=CMDT_READ_ERR;
  1274. }
  1275. i=cmd_out();
  1276. D_S[d].error_byte=0;
  1277. msg(DBG_ERR,"cc_ReadError: cmd_out(CMDx_READ_ERR) returns %d (%02X)n",i,i);
  1278. if (i<0) return (i);
  1279. if (fam0V_drive) i=1;
  1280. else i=2;
  1281. D_S[d].error_byte=infobuf[i];
  1282. msg(DBG_ERR,"cc_ReadError: infobuf[%d] is %d (%02X)n",i,D_S[d].error_byte,D_S[d].error_byte);
  1283. i=sta2err(infobuf[i]);
  1284.         if (i==-ERR_DISKCHANGE)
  1285.         {
  1286.                 D_S[d].CD_changed=0xFF;
  1287.                 D_S[d].diskstate_flags &= ~toc_bit;
  1288.         }
  1289. return (i);
  1290. }
  1291. /*==========================================================================*/
  1292. static int cmd_out_T(void)
  1293. {
  1294. #undef CMDT_TRIES
  1295. #define CMDT_TRIES 1000
  1296. #define TEST_FALSE_FF 1
  1297. static int cc_DriveReset(void);
  1298. int i, j, l=0, m, ntries;
  1299. long flags;
  1300. D_S[d].error_state=0;
  1301. D_S[d].b3=0;
  1302. D_S[d].b4=0;
  1303. D_S[d].f_drv_error=0;
  1304. for (i=0;i<10;i++) sprintf(&msgbuf[i*3]," %02X",drvcmd[i]);
  1305. msgbuf[i*3]=0;
  1306. msg(DBG_CMD,"cmd_out_T:%sn",msgbuf);
  1307. OUT(CDo_sel_i_d,0);
  1308. OUT(CDo_enable,D_S[d].drv_sel);
  1309. i=inb(CDi_status);
  1310. do_16bit=0;
  1311. if ((f_16bit)&&(!(i&0x80)))
  1312. {
  1313. do_16bit=1;
  1314. msg(DBG_TEA,"cmd_out_T: do_16bit set.n");
  1315. }
  1316. if (!(i&s_not_result_ready))
  1317. do
  1318. {
  1319. j=inb(CDi_info);
  1320. i=inb(CDi_status);
  1321. sbp_sleep(0);
  1322. msg(DBG_TEA,"cmd_out_T: spurious !s_not_result_ready. (%02X)n", j);
  1323. }
  1324. while (!(i&s_not_result_ready));
  1325. save_flags(flags); cli();
  1326. for (i=0;i<10;i++) OUT(CDo_command,drvcmd[i]);
  1327. restore_flags(flags);
  1328. for (ntries=CMDT_TRIES;ntries>0;ntries--)
  1329. {
  1330. if (drvcmd[0]==CMDT_READ_VER) sbp_sleep(HZ); /* fixme */
  1331. #if 01
  1332. OUT(CDo_sel_i_d,1);
  1333. #endif /* 01 */
  1334. if (teac==2)
  1335.                   {
  1336.                     if ((i=CDi_stat_loop_T()) == -1) break;
  1337.                   }
  1338. else
  1339.                   {
  1340. #if 0
  1341.                     OUT(CDo_sel_i_d,1);
  1342. #endif /* 0 */ 
  1343.                     i=inb(CDi_status);
  1344.                   }
  1345. if (!(i&s_not_data_ready)) /* f.e. CMDT_DISKINFO */
  1346. {
  1347. OUT(CDo_sel_i_d,1);
  1348. if (drvcmd[0]==CMDT_READ) return (0); /* handled elsewhere */
  1349. if (drvcmd[0]==CMDT_DISKINFO)
  1350. {
  1351. l=0;
  1352. do
  1353.                                 {
  1354.                                         if (do_16bit)
  1355.                                         {
  1356.                                                 i=inw(CDi_data);
  1357.                                                 infobuf[l++]=i&0x0ff;
  1358.                                                 infobuf[l++]=i>>8;
  1359. #if TEST_FALSE_FF
  1360.                                                 if ((l==2)&&(infobuf[0]==0x0ff))
  1361.                                                 {
  1362.                                                         infobuf[0]=infobuf[1];
  1363.                                                         l=1;
  1364.                                                         msg(DBG_TEA,"cmd_out_T: do_16bit: false first byte!n");
  1365.                                                 }
  1366. #endif /* TEST_FALSE_FF */ 
  1367.                                         }
  1368.                                         else infobuf[l++]=inb(CDi_data);
  1369.                                         i=inb(CDi_status);
  1370.                                 }
  1371. while (!(i&s_not_data_ready));
  1372. for (j=0;j<l;j++) sprintf(&msgbuf[j*3]," %02X",infobuf[j]);
  1373. msgbuf[j*3]=0;
  1374. msg(DBG_CMD,"cmd_out_T data response:%sn", msgbuf);
  1375. }
  1376. else
  1377. {
  1378. msg(DBG_TEA,"cmd_out_T: data response with cmd_%02X!n",
  1379.                                     drvcmd[0]);
  1380. j=0;
  1381. do
  1382. {
  1383.                                         if (do_16bit) i=inw(CDi_data);
  1384.                                         else i=inb(CDi_data);
  1385.                                         j++;
  1386.                                         i=inb(CDi_status);
  1387. }
  1388. while (!(i&s_not_data_ready));
  1389. msg(DBG_TEA,"cmd_out_T: data response: discarded %d bytes/words.n", j);
  1390. fatal_err++;
  1391. }
  1392. }
  1393. i=inb(CDi_status);
  1394. if (!(i&s_not_result_ready))
  1395. {
  1396. OUT(CDo_sel_i_d,0);
  1397. if (drvcmd[0]==CMDT_DISKINFO) m=l;
  1398. else m=0;
  1399. do
  1400. {
  1401. infobuf[m++]=inb(CDi_info);
  1402. i=inb(CDi_status);
  1403. }
  1404. while (!(i&s_not_result_ready));
  1405. for (j=0;j<m;j++) sprintf(&msgbuf[j*3]," %02X",infobuf[j]);
  1406. msgbuf[j*3]=0;
  1407. msg(DBG_CMD,"cmd_out_T info response:%sn", msgbuf);
  1408. if (drvcmd[0]==CMDT_DISKINFO)
  1409.                         {
  1410.                                 infobuf[0]=infobuf[l];
  1411.                                 if (infobuf[0]!=0x02) return (l); /* data length */
  1412.                         }
  1413. else if (infobuf[0]!=0x02) return (m); /* info length */
  1414. do
  1415. {
  1416. ++recursion;
  1417. if (recursion>1) msg(DBG_TEA,"cmd_out_T READ_ERR recursion (%02X): %d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!n", drvcmd[0], recursion);
  1418. clr_cmdbuf();
  1419. drvcmd[0]=CMDT_READ_ERR;
  1420. j=cmd_out_T(); /* !!! recursive here !!! */
  1421. --recursion;
  1422. sbp_sleep(1);
  1423. }
  1424. while (j<0);
  1425. D_S[d].error_state=infobuf[2];
  1426. D_S[d].b3=infobuf[3];
  1427. D_S[d].b4=infobuf[4];
  1428. if (D_S[d].f_drv_error)
  1429. {
  1430. D_S[d].f_drv_error=0;
  1431. cc_DriveReset();
  1432. D_S[d].error_state=2;
  1433. }
  1434. return (-D_S[d].error_state-400);
  1435. }
  1436. if (drvcmd[0]==CMDT_READ) return (0); /* handled elsewhere */
  1437. if ((teac==0)||(ntries<(CMDT_TRIES-5))) sbp_sleep(HZ/10);
  1438. else sbp_sleep(HZ/100);
  1439. if (ntries>(CMDT_TRIES-50)) continue;
  1440. msg(DBG_TEA,"cmd_out_T: next CMDT_TRIES (%02X): %d.n", drvcmd[0], ntries-1);
  1441. }
  1442. D_S[d].f_drv_error=1;
  1443. cc_DriveReset();
  1444. D_S[d].error_state=2;
  1445. return (-99);
  1446. }
  1447. /*==========================================================================*/
  1448. static int cmd_out(void)
  1449. {
  1450. int i=0;
  1451. if (famT_drive) return(cmd_out_T());
  1452. if (flags_cmd_out&f_putcmd)
  1453. unsigned long flags;
  1454. for (i=0;i<7;i++)
  1455. sprintf(&msgbuf[i*3], " %02X", drvcmd[i]);
  1456. msgbuf[i*3]=0;
  1457. msg(DBG_CMD,"cmd_out:%sn", msgbuf);
  1458. save_flags(flags); cli();
  1459. for (i=0;i<7;i++) OUT(CDo_command,drvcmd[i]);
  1460. restore_flags(flags);
  1461. }
  1462. if (response_count!=0)
  1463. {
  1464. if (cmd_type!=0)
  1465. {
  1466. if (sbpro_type==1) OUT(CDo_sel_i_d,1);
  1467. msg(DBG_INF,"misleaded to try ResponseData.n");
  1468. if (sbpro_type==1) OUT(CDo_sel_i_d,0);
  1469. return (-22);
  1470. }
  1471. else i=ResponseInfo();
  1472. if (i<0) return (i);
  1473. }
  1474. if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to CDi_stat_loop.n");
  1475. if (flags_cmd_out&f_lopsta)
  1476. {
  1477. i=CDi_stat_loop();
  1478. if ((i<0)||!(i&s_attention)) return (-8);
  1479. }
  1480. if (!(flags_cmd_out&f_getsta)) goto LOC_229;
  1481.  LOC_228:
  1482. if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cc_ReadStatus.n");
  1483. cc_ReadStatus();
  1484.  LOC_229:
  1485. if (flags_cmd_out&f_ResponseStatus) 
  1486. {
  1487. if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to ResponseStatus.n");
  1488. i=ResponseStatus();
  1489. /* builds status_bits, returns orig. status or p_busy_new */
  1490. if (i<0) return (i);
  1491. if (flags_cmd_out&(f_bit1|f_wait_if_busy))
  1492. {
  1493. if (!st_check)
  1494. {
  1495. if ((flags_cmd_out&f_bit1)&&(i&p_success)) goto LOC_232;
  1496. if ((!(flags_cmd_out&f_wait_if_busy))||(!st_busy)) goto LOC_228;
  1497. }
  1498. }
  1499. }
  1500.  LOC_232:
  1501. if (!(flags_cmd_out&f_obey_p_check)) return (0);
  1502. if (!st_check) return (0);
  1503. if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cc_ReadError.n");
  1504. i=cc_ReadError();
  1505. if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cmd_out OK.n");
  1506. msg(DBG_000,"cmd_out: cc_ReadError=%dn", i);
  1507. return (i);
  1508. }
  1509. /*==========================================================================*/
  1510. static int cc_Seek(u_int pos, char f_blk_msf)
  1511. {
  1512. int i;
  1513.   clr_cmdbuf();
  1514. if (f_blk_msf>1) return (-3);
  1515. if (fam0V_drive)
  1516. {
  1517. drvcmd[0]=CMD0_SEEK;
  1518. if (f_blk_msf==1) pos=msf2blk(pos);
  1519. drvcmd[2]=(pos>>16)&0x00FF;
  1520. drvcmd[3]=(pos>>8)&0x00FF;
  1521. drvcmd[4]=pos&0x00FF;
  1522. if (fam0_drive)
  1523.   flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
  1524. f_ResponseStatus | f_obey_p_check | f_bit1;
  1525. else
  1526.   flags_cmd_out = f_putcmd;
  1527. }
  1528. else if (fam1L_drive)
  1529. {
  1530. drvcmd[0]=CMD1_SEEK; /* same as CMD1_ and CMDL_ */
  1531. if (f_blk_msf==0) pos=blk2msf(pos);
  1532. drvcmd[1]=(pos>>16)&0x00FF;
  1533. drvcmd[2]=(pos>>8)&0x00FF;
  1534. drvcmd[3]=pos&0x00FF;
  1535. if (famL_drive)
  1536. flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
  1537. else
  1538. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  1539. }
  1540. else if (fam2_drive)
  1541. {
  1542. drvcmd[0]=CMD2_SEEK;
  1543. if (f_blk_msf==0) pos=blk2msf(pos);
  1544. drvcmd[2]=(pos>>24)&0x00FF;
  1545. drvcmd[3]=(pos>>16)&0x00FF;
  1546. drvcmd[4]=(pos>>8)&0x00FF;
  1547. drvcmd[5]=pos&0x00FF;
  1548. flags_cmd_out=f_putcmd|f_ResponseStatus;
  1549. }
  1550. else if (famT_drive)
  1551. {
  1552. drvcmd[0]=CMDT_SEEK;
  1553. if (f_blk_msf==1) pos=msf2blk(pos);
  1554. drvcmd[2]=(pos>>24)&0x00FF;
  1555. drvcmd[3]=(pos>>16)&0x00FF;
  1556. drvcmd[4]=(pos>>8)&0x00FF;
  1557. drvcmd[5]=pos&0x00FF;
  1558. D_S[d].n_bytes=1;
  1559. }
  1560. response_count=0;
  1561. i=cmd_out();
  1562. return (i);
  1563. }
  1564. /*==========================================================================*/
  1565. static int cc_SpinUp(void)
  1566. {
  1567. int i;
  1568. msg(DBG_SPI,"SpinUp.n");
  1569. D_S[d].in_SpinUp = 1;
  1570. clr_cmdbuf();
  1571. if (fam0LV_drive)
  1572. {
  1573. drvcmd[0]=CMD0_SPINUP;
  1574. if (fam0L_drive)
  1575.   flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|
  1576.     f_ResponseStatus|f_obey_p_check|f_bit1;
  1577. else
  1578.   flags_cmd_out=f_putcmd;
  1579. }
  1580. else if (fam1_drive)
  1581. {
  1582. drvcmd[0]=CMD1_SPINUP;
  1583. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  1584. }
  1585. else if (fam2_drive)
  1586. {
  1587. drvcmd[0]=CMD2_TRAY_CTL;
  1588. drvcmd[4]=0x01; /* "spinup" */
  1589. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  1590. }
  1591. else if (famT_drive)
  1592. {
  1593. drvcmd[0]=CMDT_TRAY_CTL;
  1594. drvcmd[4]=0x03; /* "insert", it hopefully spins the drive up */
  1595. }
  1596. response_count=0;
  1597. i=cmd_out();
  1598. D_S[d].in_SpinUp = 0;
  1599. return (i);
  1600. }
  1601. /*==========================================================================*/
  1602. static int cc_SpinDown(void)
  1603. {
  1604. int i;
  1605. if (fam0_drive) return (0);
  1606. clr_cmdbuf();
  1607. response_count=0;
  1608. if (fam1_drive)
  1609. {
  1610. drvcmd[0]=CMD1_SPINDOWN;
  1611. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  1612. }
  1613. else if (fam2_drive)
  1614. {
  1615. drvcmd[0]=CMD2_TRAY_CTL;
  1616. drvcmd[4]=0x02; /* "eject" */
  1617. flags_cmd_out=f_putcmd|f_ResponseStatus;
  1618. }
  1619. else if (famL_drive)
  1620. {
  1621. drvcmd[0]=CMDL_SPINDOWN;
  1622. drvcmd[1]=1;
  1623. flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
  1624. }
  1625. else if (famV_drive)
  1626. {
  1627. drvcmd[0]=CMDV_SPINDOWN;
  1628. flags_cmd_out=f_putcmd;
  1629. }
  1630. else if (famT_drive)
  1631. {
  1632. drvcmd[0]=CMDT_TRAY_CTL;
  1633. drvcmd[4]=0x02; /* "eject" */
  1634. }
  1635. i=cmd_out();
  1636. return (i);
  1637. }
  1638. /*==========================================================================*/
  1639. static int cc_get_mode_T(void)
  1640. {
  1641. int i;
  1642. clr_cmdbuf();
  1643. response_count=10;
  1644. drvcmd[0]=CMDT_GETMODE;
  1645. drvcmd[4]=response_count;
  1646. i=cmd_out_T();
  1647. return (i);
  1648. }
  1649. /*==========================================================================*/
  1650. static int cc_set_mode_T(void)
  1651. {
  1652. int i;
  1653. clr_cmdbuf();
  1654. response_count=1;
  1655. drvcmd[0]=CMDT_SETMODE;
  1656. drvcmd[1]=D_S[d].speed_byte;
  1657. drvcmd[2]=D_S[d].frmsiz>>8;
  1658. drvcmd[3]=D_S[d].frmsiz&0x0FF;
  1659. drvcmd[4]=D_S[d].f_XA; /* 1: XA */
  1660. drvcmd[5]=D_S[d].type_byte; /* 0, 1, 3 */
  1661. drvcmd[6]=D_S[d].mode_xb_6;
  1662. drvcmd[7]=D_S[d].mode_yb_7|D_S[d].volume_control;
  1663. drvcmd[8]=D_S[d].mode_xb_8;
  1664. drvcmd[9]=D_S[d].delay;
  1665. i=cmd_out_T();
  1666. return (i);
  1667. }
  1668. /*==========================================================================*/
  1669. static int cc_prep_mode_T(void)
  1670. {
  1671. int i, j;
  1672. i=cc_get_mode_T();
  1673. if (i<0) return (i);
  1674. for (i=0;i<10;i++)
  1675. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  1676. msgbuf[i*3]=0;
  1677. msg(DBG_TEA,"CMDT_GETMODE:%sn", msgbuf);
  1678. D_S[d].speed_byte=0x02; /* 0x02: auto quad, 0x82: quad, 0x81: double, 0x80: single */
  1679. D_S[d].frmsiz=make16(infobuf[2],infobuf[3]);
  1680. D_S[d].f_XA=infobuf[4];
  1681. if (D_S[d].f_XA==0) D_S[d].type_byte=0;
  1682. else D_S[d].type_byte=1;
  1683. D_S[d].mode_xb_6=infobuf[6];
  1684. D_S[d].mode_yb_7=1;
  1685. D_S[d].mode_xb_8=infobuf[8];
  1686. D_S[d].delay=0; /* 0, 1, 2, 3 */
  1687. j=cc_set_mode_T();
  1688. i=cc_get_mode_T();
  1689. for (i=0;i<10;i++)
  1690. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  1691. msgbuf[i*3]=0;
  1692. msg(DBG_TEA,"CMDT_GETMODE:%sn", msgbuf);
  1693. return (j);
  1694. }
  1695. /*==========================================================================*/
  1696. static int cc_SetSpeed(u_char speed, u_char x1, u_char x2)
  1697. {
  1698. int i;
  1699. if (fam0LV_drive) return (0);
  1700. clr_cmdbuf();
  1701. response_count=0;
  1702. if (fam1_drive)
  1703. {
  1704. drvcmd[0]=CMD1_SETMODE;
  1705. drvcmd[1]=0x03;
  1706. drvcmd[2]=speed;
  1707. drvcmd[3]=x1;
  1708. drvcmd[4]=x2;
  1709. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  1710. }
  1711. else if (fam2_drive)
  1712. {
  1713. drvcmd[0]=CMD2_SETSPEED;
  1714. if (speed&speed_auto)
  1715. {
  1716. drvcmd[2]=0xFF;
  1717. drvcmd[3]=0xFF;
  1718. }
  1719. else
  1720. {
  1721. drvcmd[2]=0;
  1722. drvcmd[3]=150;
  1723. }
  1724. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  1725. }
  1726. else if (famT_drive)
  1727. {
  1728. return (0);
  1729. }
  1730. i=cmd_out();
  1731. return (i);
  1732. }
  1733. /*==========================================================================*/
  1734. static int cc_SetVolume(void)
  1735. {
  1736. int i;
  1737. u_char channel0,channel1,volume0,volume1;
  1738. u_char control0,value0,control1,value1;
  1739. D_S[d].diskstate_flags &= ~volume_bit;
  1740. clr_cmdbuf();
  1741. channel0=D_S[d].vol_chan0;
  1742. volume0=D_S[d].vol_ctrl0;
  1743. channel1=control1=D_S[d].vol_chan1;
  1744. volume1=value1=D_S[d].vol_ctrl1;
  1745. control0=value0=0;
  1746. if (famV_drive) return (0);
  1747. if (((D_S[d].drv_options&audio_mono)!=0)&&(D_S[d].drv_type>=drv_211))
  1748. {
  1749. if ((volume0!=0)&&(volume1==0))
  1750. {
  1751. volume1=volume0;
  1752. channel1=channel0;
  1753. }
  1754. else if ((volume0==0)&&(volume1!=0))
  1755. {
  1756. volume0=volume1;
  1757. channel0=channel1;
  1758. }
  1759. }
  1760. if (channel0>1)
  1761. {
  1762. channel0=0;
  1763. volume0=0;
  1764. }
  1765. if (channel1>1)
  1766. {
  1767. channel1=1;
  1768. volume1=0;
  1769. }
  1770. if (fam1_drive)
  1771. {
  1772. control0=channel0+1;
  1773. control1=channel1+1;
  1774. value0=(volume0>volume1)?volume0:volume1;
  1775. value1=value0;
  1776. if (volume0==0) control0=0;
  1777. if (volume1==0) control1=0;
  1778. drvcmd[0]=CMD1_SETMODE;
  1779. drvcmd[1]=0x05;
  1780. drvcmd[3]=control0;
  1781. drvcmd[4]=value0;
  1782. drvcmd[5]=control1;
  1783. drvcmd[6]=value1;
  1784. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  1785. }
  1786. else if (fam2_drive)
  1787. {
  1788. control0=channel0+1;
  1789. control1=channel1+1;
  1790. value0=(volume0>volume1)?volume0:volume1;
  1791. value1=value0;
  1792. if (volume0==0) control0=0;
  1793. if (volume1==0) control1=0;
  1794. drvcmd[0]=CMD2_SETMODE;
  1795. drvcmd[1]=0x0E;
  1796. drvcmd[3]=control0;
  1797. drvcmd[4]=value0;
  1798. drvcmd[5]=control1;
  1799. drvcmd[6]=value1;
  1800. flags_cmd_out=f_putcmd|f_ResponseStatus;
  1801. }
  1802. else if (famL_drive)
  1803. {
  1804. if ((volume0==0)||(channel0!=0)) control0 |= 0x80;
  1805. if ((volume1==0)||(channel1!=1)) control0 |= 0x40;
  1806. if (volume0|volume1) value0=0x80;
  1807. drvcmd[0]=CMDL_SETMODE;
  1808. drvcmd[1]=0x03;
  1809. drvcmd[4]=control0;
  1810. drvcmd[5]=value0;
  1811. flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
  1812. }
  1813. else if (fam0_drive) /* different firmware levels */
  1814. {
  1815. if (D_S[d].drv_type>=drv_300)
  1816. {
  1817. control0=volume0&0xFC;
  1818. value0=volume1&0xFC;
  1819. if ((volume0!=0)&&(volume0<4)) control0 |= 0x04;
  1820. if ((volume1!=0)&&(volume1<4)) value0 |= 0x04;
  1821. if (channel0!=0) control0 |= 0x01;
  1822. if (channel1==1) value0 |= 0x01;
  1823. }
  1824. else
  1825. {
  1826. value0=(volume0>volume1)?volume0:volume1;
  1827. if (D_S[d].drv_type<drv_211)
  1828. {
  1829. if (channel0!=0)
  1830. {
  1831. i=channel1;
  1832. channel1=channel0;
  1833. channel0=i;
  1834. i=volume1;
  1835. volume1=volume0;
  1836. volume0=i;
  1837. }
  1838. if (channel0==channel1)
  1839. {
  1840. if (channel0==0)
  1841. {
  1842. channel1=1;
  1843. volume1=0;
  1844. volume0=value0;
  1845. }
  1846. else
  1847. {
  1848. channel0=0;
  1849. volume0=0;
  1850. volume1=value0;
  1851. }
  1852. }
  1853. }
  1854. if ((volume0!=0)&&(volume1!=0))
  1855. {
  1856. if (volume0==0xFF) volume1=0xFF;
  1857. else if (volume1==0xFF) volume0=0xFF;
  1858. }
  1859. else if (D_S[d].drv_type<drv_201) volume0=volume1=value0;
  1860. if (D_S[d].drv_type>=drv_201)
  1861. {
  1862. if (volume0==0) control0 |= 0x80;
  1863. if (volume1==0) control0 |= 0x40;
  1864. }
  1865. if (D_S[d].drv_type>=drv_211)
  1866. {
  1867. if (channel0!=0) control0 |= 0x20;
  1868. if (channel1!=1) control0 |= 0x10;
  1869. }
  1870. }
  1871. drvcmd[0]=CMD0_SETMODE;
  1872. drvcmd[1]=0x83;
  1873. drvcmd[4]=control0;
  1874. drvcmd[5]=value0;
  1875. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  1876. }
  1877. else if (famT_drive)
  1878. {
  1879. D_S[d].volume_control=0;
  1880. if (!volume0) D_S[d].volume_control|=0x10;
  1881. if (!volume1) D_S[d].volume_control|=0x20;
  1882. i=cc_prep_mode_T();
  1883. if (i<0) return (i);
  1884. }
  1885. if (!famT_drive)
  1886. {
  1887. response_count=0;
  1888. i=cmd_out();
  1889. if (i<0) return (i);
  1890. }
  1891. D_S[d].diskstate_flags |= volume_bit;
  1892. return (0);
  1893. }
  1894. /*==========================================================================*/
  1895. static int GetStatus(void)
  1896. {
  1897. int i;
  1898. if (famT_drive) return (0);
  1899. flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;
  1900. response_count=0;
  1901. cmd_type=0;
  1902. i=cmd_out();
  1903. return (i);
  1904. }
  1905. /*==========================================================================*/
  1906. static int cc_DriveReset(void)
  1907. {
  1908. int i;
  1909. msg(DBG_RES,"cc_DriveReset called.n");
  1910. clr_cmdbuf();
  1911. response_count=0;
  1912. if (fam0LV_drive) OUT(CDo_reset,0x00);
  1913. else if (fam1_drive)
  1914. {
  1915. drvcmd[0]=CMD1_RESET;
  1916. flags_cmd_out=f_putcmd;
  1917. i=cmd_out();
  1918. }
  1919. else if (fam2_drive)
  1920. {
  1921. drvcmd[0]=CMD2_RESET;
  1922. flags_cmd_out=f_putcmd;
  1923. i=cmd_out();
  1924. OUT(CDo_reset,0x00);
  1925. }
  1926. else if (famT_drive)
  1927. {
  1928. OUT(CDo_sel_i_d,0);
  1929. OUT(CDo_enable,D_S[d].drv_sel);
  1930. OUT(CDo_command,CMDT_RESET);
  1931. for (i=1;i<10;i++) OUT(CDo_command,0);
  1932. }
  1933. if (fam0LV_drive) sbp_sleep(5*HZ); /* wait 5 seconds */
  1934. else sbp_sleep(1*HZ); /* wait a second */
  1935. #if 1
  1936. if (famT_drive)
  1937. {
  1938. msg(DBG_TEA, "================CMDT_RESET given=================.n");
  1939. sbp_sleep(3*HZ);
  1940. }
  1941. #endif /* 1 */ 
  1942. flush_status();
  1943. i=GetStatus();
  1944. if (i<0) return i;
  1945. if (!famT_drive)
  1946. if (D_S[d].error_byte!=aud_12) return -501;
  1947. return (0);
  1948. }
  1949. /*==========================================================================*/
  1950. static int SetSpeed(void)
  1951. {
  1952. int i, speed;
  1953. if (!(D_S[d].drv_options&(speed_auto|speed_300|speed_150))) return (0);
  1954. speed=speed_auto;
  1955. if (!(D_S[d].drv_options&speed_auto))
  1956. {
  1957. speed |= speed_300;
  1958. if (!(D_S[d].drv_options&speed_300)) speed=0;
  1959. }
  1960. i=cc_SetSpeed(speed,0,0);
  1961. return (i);
  1962. }
  1963. static void switch_drive(int i);
  1964. static int sbpcd_select_speed(struct cdrom_device_info *cdi, int speed)
  1965. {
  1966.   int i = MINOR(cdi->dev);
  1967.   if (i != d)
  1968.     switch_drive(i);
  1969.   return cc_SetSpeed(speed == 2 ? speed_300 : speed_150, 0, 0);
  1970. }
  1971. /*==========================================================================*/
  1972. static int DriveReset(void)
  1973. {
  1974. int i;
  1975. i=cc_DriveReset();
  1976. if (i<0) return (-22);
  1977. do
  1978. {
  1979. i=GetStatus();
  1980. if ((i<0)&&(i!=-ERR_DISKCHANGE)) {
  1981. return (-2); /* from sta2err */
  1982. }
  1983. if (!st_caddy_in) break;
  1984. sbp_sleep(1);
  1985. }
  1986. while (!st_diskok);
  1987. #if 000
  1988. D_S[d].CD_changed=1;
  1989. #endif
  1990. if ((st_door_closed) && (st_caddy_in))
  1991. {
  1992. i=DiskInfo();
  1993. if (i<0) return (-23);
  1994. }
  1995. return (0);
  1996. }
  1997. static int sbpcd_reset(struct cdrom_device_info *cdi)
  1998. {
  1999.   int i = MINOR(cdi->dev);
  2000.   if (i != d)
  2001.     switch_drive(i);
  2002.   return DriveReset();
  2003. }
  2004. /*==========================================================================*/
  2005. static int cc_PlayAudio(int pos_audio_start,int pos_audio_end)
  2006. {
  2007. int i, j, n;
  2008. if (D_S[d].audio_state==audio_playing) return (-EINVAL);
  2009. clr_cmdbuf();
  2010. response_count=0;
  2011. if (famLV_drive)
  2012. {
  2013. drvcmd[0]=CMDL_PLAY;
  2014. i=msf2blk(pos_audio_start);
  2015. n=msf2blk(pos_audio_end)+1-i;
  2016. drvcmd[1]=(i>>16)&0x00FF;
  2017. drvcmd[2]=(i>>8)&0x00FF;
  2018. drvcmd[3]=i&0x00FF;
  2019. drvcmd[4]=(n>>16)&0x00FF;
  2020. drvcmd[5]=(n>>8)&0x00FF;
  2021. drvcmd[6]=n&0x00FF;
  2022. if (famL_drive)
  2023. flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
  2024. f_ResponseStatus | f_obey_p_check | f_wait_if_busy;
  2025. else
  2026.   flags_cmd_out = f_putcmd;
  2027. }
  2028. else
  2029. {
  2030. j=1;
  2031. if (fam1_drive)
  2032. {
  2033. drvcmd[0]=CMD1_PLAY_MSF;
  2034. flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus |
  2035. f_obey_p_check | f_wait_if_busy;
  2036. }
  2037. else if (fam2_drive)
  2038. {
  2039. drvcmd[0]=CMD2_PLAY_MSF;
  2040. flags_cmd_out = f_putcmd | f_ResponseStatus | f_obey_p_check;
  2041. }
  2042. else if (famT_drive)
  2043. {
  2044. drvcmd[0]=CMDT_PLAY_MSF;
  2045. j=3;
  2046. response_count=1;
  2047. }
  2048. else if (fam0_drive)
  2049. {
  2050. drvcmd[0]=CMD0_PLAY_MSF;
  2051. flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
  2052. f_ResponseStatus | f_obey_p_check | f_wait_if_busy;
  2053. }
  2054. drvcmd[j]=(pos_audio_start>>16)&0x00FF;
  2055. drvcmd[j+1]=(pos_audio_start>>8)&0x00FF;
  2056. drvcmd[j+2]=pos_audio_start&0x00FF;
  2057. drvcmd[j+3]=(pos_audio_end>>16)&0x00FF;
  2058. drvcmd[j+4]=(pos_audio_end>>8)&0x00FF;
  2059. drvcmd[j+5]=pos_audio_end&0x00FF;
  2060. }
  2061. i=cmd_out();
  2062. return (i);
  2063. }
  2064. /*==========================================================================*/
  2065. static int cc_Pause_Resume(int pau_res)
  2066. {
  2067. int i;
  2068. clr_cmdbuf();
  2069. response_count=0;
  2070. if (fam1_drive)
  2071. {
  2072. drvcmd[0]=CMD1_PAU_RES;
  2073. if (pau_res!=1) drvcmd[1]=0x80;
  2074. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  2075. }
  2076. else if (fam2_drive)
  2077. {
  2078. drvcmd[0]=CMD2_PAU_RES;
  2079. if (pau_res!=1) drvcmd[2]=0x01;
  2080. flags_cmd_out=f_putcmd|f_ResponseStatus;
  2081. }
  2082. else if (fam0LV_drive)
  2083. {
  2084. drvcmd[0]=CMD0_PAU_RES;
  2085. if (pau_res!=1) drvcmd[1]=0x80;
  2086. if (famL_drive)
  2087. flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|
  2088. f_obey_p_check|f_bit1;
  2089. else if (famV_drive)
  2090.   flags_cmd_out=f_putcmd;
  2091. else
  2092. flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|
  2093. f_obey_p_check;
  2094. }
  2095. else if (famT_drive)
  2096. {
  2097. if (pau_res==3) return (cc_PlayAudio(D_S[d].pos_audio_start,D_S[d].pos_audio_end));
  2098. else if (pau_res==1) drvcmd[0]=CMDT_PAUSE;
  2099. else return (-56);
  2100. }
  2101. i=cmd_out();
  2102. return (i);
  2103. }
  2104. /*==========================================================================*/
  2105. static int cc_LockDoor(char lock)
  2106. {
  2107. int i;
  2108. if (fam0_drive) return (0);
  2109. msg(DBG_LCK,"cc_LockDoor: %d (drive %d)n", lock, d);
  2110. msg(DBG_LCS,"p_door_locked bit %d beforen", st_door_locked);
  2111. clr_cmdbuf();
  2112. response_count=0;
  2113. if (fam1_drive)
  2114. {
  2115. drvcmd[0]=CMD1_LOCK_CTL;
  2116. if (lock==1) drvcmd[1]=0x01;
  2117. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2118. }
  2119. else if (fam2_drive)
  2120. {
  2121. drvcmd[0]=CMD2_LOCK_CTL;
  2122. if (lock==1) drvcmd[4]=0x01;
  2123. flags_cmd_out=f_putcmd|f_ResponseStatus;
  2124. }
  2125. else if (famLV_drive)
  2126. {
  2127. drvcmd[0]=CMDL_LOCK_CTL;
  2128. if (lock==1) drvcmd[1]=0x01;
  2129. if (famL_drive)
  2130.   flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
  2131. else
  2132.   flags_cmd_out=f_putcmd;
  2133. }
  2134. else if (famT_drive)
  2135. {
  2136. drvcmd[0]=CMDT_LOCK_CTL;
  2137. if (lock==1) drvcmd[4]=0x01;
  2138. }
  2139. i=cmd_out();
  2140. msg(DBG_LCS,"p_door_locked bit %d aftern", st_door_locked);
  2141. return (i);
  2142. }
  2143. /*==========================================================================*/
  2144. /*==========================================================================*/
  2145. static int UnLockDoor(void)
  2146. {
  2147. int i,j;
  2148. j=20;
  2149. do
  2150. {
  2151. i=cc_LockDoor(0);
  2152. --j;
  2153. sbp_sleep(1);
  2154. }
  2155. while ((i<0)&&(j));
  2156. if (i<0)
  2157. {
  2158. cc_DriveReset();
  2159. return -84;
  2160. }
  2161. return (0);
  2162. }
  2163. /*==========================================================================*/
  2164. static int LockDoor(void)
  2165. {
  2166. int i,j;
  2167. j=20;
  2168. do
  2169. {
  2170. i=cc_LockDoor(1);
  2171. --j;
  2172. sbp_sleep(1);
  2173. }
  2174. while ((i<0)&&(j));
  2175. if (j==0)
  2176. {
  2177. cc_DriveReset();
  2178. j=20;
  2179. do
  2180. {
  2181. i=cc_LockDoor(1);
  2182. --j;
  2183. sbp_sleep(1);
  2184. }
  2185. while ((i<0)&&(j));
  2186. }
  2187. return (i);
  2188. }
  2189. static int sbpcd_lock_door(struct cdrom_device_info *cdi, int lock)
  2190. {
  2191.   return lock ? LockDoor() : UnLockDoor();
  2192. }
  2193. /*==========================================================================*/
  2194. static int cc_CloseTray(void)
  2195. {
  2196. int i;
  2197. if (fam0_drive) return (0);
  2198. msg(DBG_LCK,"cc_CloseTray (drive %d)n", d);
  2199. msg(DBG_LCS,"p_door_closed bit %d beforen", st_door_closed);
  2200. clr_cmdbuf();
  2201. response_count=0;
  2202. if (fam1_drive)
  2203. {
  2204. drvcmd[0]=CMD1_TRAY_CTL;
  2205. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  2206. }
  2207. else if (fam2_drive)
  2208. {
  2209. drvcmd[0]=CMD2_TRAY_CTL;
  2210. drvcmd[1]=0x01;
  2211. drvcmd[4]=0x03; /* "insert" */
  2212. flags_cmd_out=f_putcmd|f_ResponseStatus;
  2213. }
  2214. else if (famLV_drive)
  2215. {
  2216. drvcmd[0]=CMDL_TRAY_CTL;
  2217. if (famLV_drive)
  2218.   flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|
  2219. f_ResponseStatus|f_obey_p_check|f_bit1;
  2220. else
  2221.   flags_cmd_out=f_putcmd;
  2222. }
  2223. else if (famT_drive)
  2224. {
  2225. drvcmd[0]=CMDT_TRAY_CTL;
  2226. drvcmd[4]=0x03; /* "insert" */
  2227. }
  2228. i=cmd_out();
  2229. msg(DBG_LCS,"p_door_closed bit %d aftern", st_door_closed);
  2230. i=cc_ReadError();
  2231. flags_cmd_out |= f_respo2;
  2232. cc_ReadStatus(); /* command: give 1-byte status */
  2233. i=ResponseStatus();
  2234. if (famT_drive&&(i<0))
  2235. {
  2236. cc_DriveReset();
  2237. i=ResponseStatus();
  2238. #if 0
  2239.                 sbp_sleep(HZ);
  2240. #endif /* 0 */ 
  2241. i=ResponseStatus();
  2242. }
  2243. if (i<0)
  2244. {
  2245. msg(DBG_INF,"sbpcd cc_CloseTray: ResponseStatus timed out (%d).n",i);
  2246. }
  2247. if (!(famT_drive))
  2248. {
  2249. if (!st_spinning)
  2250. {
  2251. cc_SpinUp();
  2252. if (st_check) i=cc_ReadError();
  2253. flags_cmd_out |= f_respo2;
  2254. cc_ReadStatus();
  2255. i=ResponseStatus();
  2256. } else {
  2257. }
  2258. }
  2259. i=DiskInfo();
  2260. return (i);
  2261. }
  2262. static int sbpcd_tray_move(struct cdrom_device_info *cdi, int position)
  2263. {
  2264. int i;
  2265. int retval=0;
  2266. i = MINOR(cdi->dev);
  2267. switch_drive(i);
  2268. /* DUH! --AJK */
  2269. if(D_S[d].CD_changed != 0xFF) {
  2270. D_S[d].CD_changed=0xFF;
  2271. D_S[d].diskstate_flags &= ~cd_size_bit;
  2272. }
  2273. if (position == 1) {
  2274. cc_SpinDown();
  2275. } else {
  2276. retval=cc_CloseTray();
  2277. }
  2278.   return retval;
  2279. }
  2280. /*==========================================================================*/
  2281. static int cc_ReadSubQ(void)
  2282. {
  2283. int i,j;
  2284. D_S[d].diskstate_flags &= ~subq_bit;
  2285. for (j=255;j>0;j--)
  2286. {
  2287. clr_cmdbuf();
  2288. if (fam1_drive)
  2289. {
  2290. drvcmd[0]=CMD1_READSUBQ;
  2291. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2292. response_count=11;
  2293. }
  2294. else if (fam2_drive)
  2295. {
  2296. drvcmd[0]=CMD2_READSUBQ;
  2297. drvcmd[1]=0x02;
  2298. drvcmd[3]=0x01;
  2299. flags_cmd_out=f_putcmd;
  2300. response_count=10;
  2301. }
  2302. else if (fam0LV_drive)
  2303. {
  2304. drvcmd[0]=CMD0_READSUBQ;
  2305. drvcmd[1]=0x02;
  2306. if (famLV_drive)
  2307. flags_cmd_out=f_putcmd;
  2308. else
  2309. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2310. response_count=13;
  2311. }
  2312. else if (famT_drive)
  2313. {
  2314. response_count=12;
  2315. drvcmd[0]=CMDT_READSUBQ;
  2316. drvcmd[1]=0x02;
  2317. drvcmd[2]=0x40;
  2318. drvcmd[3]=0x01;
  2319. drvcmd[8]=response_count;
  2320. }
  2321. i=cmd_out();
  2322. if (i<0) return (i);
  2323. for (i=0;i<response_count;i++)
  2324. {
  2325. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  2326. msgbuf[i*3]=0;
  2327. msg(DBG_SQ1,"cc_ReadSubQ:%sn", msgbuf);
  2328. }
  2329. if (famT_drive) break;
  2330. if (infobuf[0]!=0) break;
  2331. if ((!st_spinning) || (j==1))
  2332. {
  2333. D_S[d].SubQ_ctl_adr=D_S[d].SubQ_trk=D_S[d].SubQ_pnt_idx=D_S[d].SubQ_whatisthis=0;
  2334. D_S[d].SubQ_run_tot=D_S[d].SubQ_run_trk=0;
  2335. return (0);
  2336. }
  2337. }
  2338. if (famT_drive) D_S[d].SubQ_ctl_adr=infobuf[1];
  2339. else D_S[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]);
  2340. D_S[d].SubQ_trk=byt2bcd(infobuf[2]);
  2341. D_S[d].SubQ_pnt_idx=byt2bcd(infobuf[3]);
  2342. if (fam0LV_drive) i=5;
  2343. else if (fam12_drive) i=4;
  2344. else if (famT_drive) i=8;
  2345. D_S[d].SubQ_run_tot=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */
  2346. i=7;
  2347. if (fam0LV_drive) i=9;
  2348. else if (fam12_drive) i=7;
  2349. else if (famT_drive) i=4;
  2350. D_S[d].SubQ_run_trk=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */
  2351. D_S[d].SubQ_whatisthis=infobuf[i+3];
  2352. D_S[d].diskstate_flags |= subq_bit;
  2353. return (0);
  2354. }
  2355. /*==========================================================================*/
  2356. static int cc_ModeSense(void)
  2357. {
  2358. int i;
  2359. if (fam2_drive) return (0);
  2360. if (famV_drive) return (0);
  2361. D_S[d].diskstate_flags &= ~frame_size_bit;
  2362. clr_cmdbuf();
  2363. if (fam1_drive)
  2364. {
  2365. response_count=5;
  2366. drvcmd[0]=CMD1_GETMODE;
  2367. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2368. }
  2369. else if (fam0L_drive)
  2370. {
  2371. response_count=2;
  2372. drvcmd[0]=CMD0_GETMODE;
  2373. if (famL_drive) flags_cmd_out=f_putcmd;
  2374. else flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2375. }
  2376. else if (famT_drive)
  2377. {
  2378. response_count=10;
  2379. drvcmd[0]=CMDT_GETMODE;
  2380. drvcmd[4]=response_count;
  2381. }
  2382. i=cmd_out();
  2383. if (i<0) return (i);
  2384. i=0;
  2385. D_S[d].sense_byte=0;
  2386. if (fam1_drive) D_S[d].sense_byte=infobuf[i++];
  2387. else if (famT_drive)
  2388. {
  2389. if (infobuf[4]==0x01) D_S[d].xa_byte=0x20;
  2390. else D_S[d].xa_byte=0;
  2391. i=2;
  2392. }
  2393. D_S[d].frame_size=make16(infobuf[i],infobuf[i+1]);
  2394. for (i=0;i<response_count;i++)
  2395. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  2396. msgbuf[i*3]=0;
  2397. msg(DBG_XA1,"cc_ModeSense:%sn", msgbuf);
  2398. D_S[d].diskstate_flags |= frame_size_bit;
  2399. return (0);
  2400. }
  2401. /*==========================================================================*/
  2402. /*==========================================================================*/
  2403. static int cc_ModeSelect(int framesize)
  2404. {
  2405. int i;
  2406. if (fam2_drive) return (0);
  2407. if (famV_drive) return (0);
  2408. D_S[d].diskstate_flags &= ~frame_size_bit;
  2409. clr_cmdbuf();
  2410. D_S[d].frame_size=framesize;
  2411. if (framesize==CD_FRAMESIZE_RAW) D_S[d].sense_byte=0x82;
  2412. else D_S[d].sense_byte=0x00;
  2413. msg(DBG_XA1,"cc_ModeSelect: %02X %04Xn",
  2414.     D_S[d].sense_byte, D_S[d].frame_size);
  2415. if (fam1_drive)
  2416. {
  2417. drvcmd[0]=CMD1_SETMODE;
  2418. drvcmd[1]=0x00;
  2419. drvcmd[2]=D_S[d].sense_byte;
  2420. drvcmd[3]=(D_S[d].frame_size>>8)&0xFF;
  2421. drvcmd[4]=D_S[d].frame_size&0xFF;
  2422. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2423. }
  2424. else if (fam0L_drive)
  2425. {
  2426. drvcmd[0]=CMD0_SETMODE;
  2427. drvcmd[1]=0x00;
  2428. drvcmd[2]=(D_S[d].frame_size>>8)&0xFF;
  2429. drvcmd[3]=D_S[d].frame_size&0xFF;
  2430. drvcmd[4]=0x00;
  2431. if(famL_drive)
  2432. flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check;
  2433. else
  2434. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2435. }
  2436. else if (famT_drive)
  2437. {
  2438. return (-1);
  2439. }
  2440. response_count=0;
  2441. i=cmd_out();
  2442. if (i<0) return (i);
  2443. D_S[d].diskstate_flags |= frame_size_bit;
  2444. return (0);
  2445. }
  2446. /*==========================================================================*/
  2447. static int cc_GetVolume(void)
  2448. {
  2449. int i;
  2450. u_char switches;
  2451. u_char chan0=0;
  2452. u_char vol0=0;
  2453. u_char chan1=1;
  2454. u_char vol1=0;
  2455. if (famV_drive) return (0);
  2456. D_S[d].diskstate_flags &= ~volume_bit;
  2457. clr_cmdbuf();
  2458. if (fam1_drive)
  2459. {
  2460. drvcmd[0]=CMD1_GETMODE;
  2461. drvcmd[1]=0x05;
  2462. response_count=5;
  2463. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2464. }
  2465. else if (fam2_drive)
  2466. {
  2467. drvcmd[0]=CMD2_GETMODE;
  2468. drvcmd[1]=0x0E;
  2469. response_count=5;
  2470. flags_cmd_out=f_putcmd;
  2471. }
  2472. else if (fam0L_drive)
  2473. {
  2474. drvcmd[0]=CMD0_GETMODE;
  2475. drvcmd[1]=0x03;
  2476. response_count=2;
  2477. if(famL_drive)
  2478. flags_cmd_out=f_putcmd;
  2479. else
  2480. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2481. }
  2482. else if (famT_drive)
  2483. {
  2484. i=cc_get_mode_T();
  2485. if (i<0) return (i);
  2486. }
  2487. if (!famT_drive)
  2488. {
  2489. i=cmd_out();
  2490. if (i<0) return (i);
  2491. }
  2492. if (fam1_drive)
  2493. {
  2494. chan0=infobuf[1]&0x0F;
  2495. vol0=infobuf[2];
  2496. chan1=infobuf[3]&0x0F;
  2497. vol1=infobuf[4];
  2498. if (chan0==0)
  2499. {
  2500. chan0=1;
  2501. vol0=0;
  2502. }
  2503. if (chan1==0)
  2504. {
  2505. chan1=2;
  2506. vol1=0;
  2507. }
  2508. chan0 >>= 1;
  2509. chan1 >>= 1;
  2510. }
  2511. else if (fam2_drive)
  2512. {
  2513. chan0=infobuf[1];
  2514. vol0=infobuf[2];
  2515. chan1=infobuf[3];
  2516. vol1=infobuf[4];
  2517. }
  2518. else if (famL_drive)
  2519. {
  2520. chan0=0;
  2521. chan1=1;
  2522. vol0=vol1=infobuf[1];
  2523. switches=infobuf[0];
  2524. if ((switches&0x80)!=0) chan0=1;
  2525. if ((switches&0x40)!=0) chan1=0;
  2526. }
  2527. else if (fam0_drive) /* different firmware levels */
  2528. {
  2529. chan0=0;
  2530. chan1=1;
  2531. vol0=vol1=infobuf[1];
  2532. if (D_S[d].drv_type>=drv_201)
  2533. {
  2534. if (D_S[d].drv_type<drv_300)
  2535. {
  2536. switches=infobuf[0];
  2537. if ((switches&0x80)!=0) vol0=0;
  2538. if ((switches&0x40)!=0) vol1=0;
  2539. if (D_S[d].drv_type>=drv_211)
  2540. {
  2541. if ((switches&0x20)!=0) chan0=1;
  2542. if ((switches&0x10)!=0) chan1=0;
  2543. }
  2544. }
  2545. else
  2546. {
  2547. vol0=infobuf[0];
  2548. if ((vol0&0x01)!=0) chan0=1;
  2549. if ((vol1&0x01)==0) chan1=0;
  2550. vol0 &= 0xFC;
  2551. vol1 &= 0xFC;
  2552. if (vol0!=0) vol0 += 3;
  2553. if (vol1!=0) vol1 += 3;
  2554. }
  2555. }
  2556. }
  2557. else if (famT_drive)
  2558. {
  2559. D_S[d].volume_control=infobuf[7];
  2560. chan0=0;
  2561. chan1=1;
  2562. if (D_S[d].volume_control&0x10) vol0=0;
  2563. else vol0=0xff;
  2564. if (D_S[d].volume_control&0x20) vol1=0;
  2565. else vol1=0xff;
  2566. }
  2567. D_S[d].vol_chan0=chan0;
  2568. D_S[d].vol_ctrl0=vol0;
  2569. D_S[d].vol_chan1=chan1;
  2570. D_S[d].vol_ctrl1=vol1;
  2571. #if 000
  2572. D_S[d].vol_chan2=2;
  2573. D_S[d].vol_ctrl2=0xFF;
  2574. D_S[d].vol_chan3=3;
  2575. D_S[d].vol_ctrl3=0xFF;
  2576. #endif /*  000 */
  2577. D_S[d].diskstate_flags |= volume_bit;
  2578. return (0);
  2579. }
  2580. /*==========================================================================*/
  2581. static int cc_ReadCapacity(void)
  2582. {
  2583. int i, j;
  2584. if (fam2_drive) return (0); /* some firmware lacks this command */
  2585. if (famLV_drive) return (0); /* some firmware lacks this command */
  2586. if (famT_drive) return (0); /* done with cc_ReadTocDescr() */
  2587. D_S[d].diskstate_flags &= ~cd_size_bit;
  2588. for (j=3;j>0;j--)
  2589. {
  2590. clr_cmdbuf();
  2591. if (fam1_drive)
  2592. {
  2593. drvcmd[0]=CMD1_CAPACITY;
  2594. response_count=5;
  2595. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2596. }
  2597. #if 00
  2598. else if (fam2_drive)
  2599. {
  2600. drvcmd[0]=CMD2_CAPACITY;
  2601. response_count=8;
  2602. flags_cmd_out=f_putcmd;
  2603. }
  2604. #endif
  2605. else if (fam0_drive)
  2606. {
  2607. drvcmd[0]=CMD0_CAPACITY;
  2608. response_count=5;
  2609. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2610. }
  2611. i=cmd_out();
  2612. if (i>=0) break;
  2613. msg(DBG_000,"cc_ReadCapacity: cmd_out: err %dn", i);
  2614. cc_ReadError();
  2615. }
  2616. if (j==0) return (i);
  2617. if (fam1_drive) D_S[d].CDsize_frm=msf2blk(make32(make16(0,infobuf[0]),make16(infobuf[1],infobuf[2])))+CD_MSF_OFFSET;
  2618. else if (fam0_drive) D_S[d].CDsize_frm=make32(make16(0,infobuf[0]),make16(infobuf[1],infobuf[2]));
  2619. #if 00
  2620. else if (fam2_drive) D_S[d].CDsize_frm=make32(make16(infobuf[0],infobuf[1]),make16(infobuf[2],infobuf[3]));
  2621. #endif
  2622. D_S[d].diskstate_flags |= cd_size_bit;
  2623. msg(DBG_000,"cc_ReadCapacity: %d frames.n", D_S[d].CDsize_frm);
  2624. return (0);
  2625. }
  2626. /*==========================================================================*/
  2627. static int cc_ReadTocDescr(void)
  2628. {
  2629. int i;
  2630. D_S[d].diskstate_flags &= ~toc_bit;
  2631. clr_cmdbuf();
  2632. if (fam1_drive)
  2633. {
  2634. drvcmd[0]=CMD1_DISKINFO;
  2635. response_count=6;
  2636. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2637. }
  2638. else if (fam0LV_drive)
  2639. {
  2640. drvcmd[0]=CMD0_DISKINFO;
  2641. response_count=6;
  2642. if(famLV_drive)
  2643. flags_cmd_out=f_putcmd;
  2644. else
  2645. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2646. }
  2647. else if (fam2_drive)
  2648. {
  2649. /* possibly longer timeout periods necessary */
  2650. D_S[d].f_multisession=0;
  2651. drvcmd[0]=CMD2_DISKINFO;
  2652. drvcmd[1]=0x02;
  2653. drvcmd[2]=0xAB;
  2654. drvcmd[3]=0xFF; /* session */
  2655. response_count=8;
  2656. flags_cmd_out=f_putcmd;
  2657. }
  2658. else if (famT_drive)
  2659. {
  2660. D_S[d].f_multisession=0;
  2661. response_count=12;
  2662. drvcmd[0]=CMDT_DISKINFO;
  2663. drvcmd[1]=0x02;
  2664. drvcmd[6]=CDROM_LEADOUT;
  2665. drvcmd[8]=response_count;
  2666. drvcmd[9]=0x00;
  2667. }
  2668. i=cmd_out();
  2669. if (i<0) return (i);
  2670. if ((famT_drive)&&(i<response_count)) return (-100-i);
  2671. if ((fam1_drive)||(fam2_drive)||(fam0LV_drive))
  2672. D_S[d].xa_byte=infobuf[0];
  2673. if (fam2_drive)
  2674. {
  2675. D_S[d].first_session=infobuf[1];
  2676. D_S[d].last_session=infobuf[2];
  2677. D_S[d].n_first_track=infobuf[3];
  2678. D_S[d].n_last_track=infobuf[4];
  2679. if (D_S[d].first_session!=D_S[d].last_session)
  2680. {
  2681. D_S[d].f_multisession=1;
  2682. D_S[d].lba_multi=msf2blk(make32(make16(0,infobuf[5]),make16(infobuf[6],infobuf[7])));
  2683. }
  2684. #if 0
  2685. if (D_S[d].first_session!=D_S[d].last_session)
  2686. {
  2687. if (D_S[d].last_session<=20)
  2688. zwanzig=D_S[d].last_session+1;
  2689. else zwanzig=20;
  2690. for (count=D_S[d].first_session;count<zwanzig;count++)
  2691. {
  2692. drvcmd[0]=CMD2_DISKINFO;
  2693. drvcmd[1]=0x02;
  2694. drvcmd[2]=0xAB;
  2695. drvcmd[3]=count;
  2696. response_count=8;
  2697. flags_cmd_out=f_putcmd;
  2698. i=cmd_out();
  2699. if (i<0) return (i);
  2700. D_S[d].msf_multi_n[count]=make32(make16(0,infobuf[5]),make16(infobuf[6],infobuf[7]));
  2701. }
  2702. D_S[d].diskstate_flags |= multisession_bit;
  2703. }
  2704. #endif
  2705. drvcmd[0]=CMD2_DISKINFO;
  2706. drvcmd[1]=0x02;
  2707. drvcmd[2]=0xAA;
  2708. drvcmd[3]=0xFF;
  2709. response_count=5;
  2710. flags_cmd_out=f_putcmd;
  2711. i=cmd_out();
  2712. if (i<0) return (i);
  2713. D_S[d].size_msf=make32(make16(0,infobuf[2]),make16(infobuf[3],infobuf[4]));
  2714. D_S[d].size_blk=msf2blk(D_S[d].size_msf);
  2715. D_S[d].CDsize_frm=D_S[d].size_blk+1;
  2716. }
  2717. else if (famT_drive)
  2718. {
  2719. D_S[d].size_msf=make32(make16(infobuf[8],infobuf[9]),make16(infobuf[10],infobuf[11]));
  2720. D_S[d].size_blk=msf2blk(D_S[d].size_msf);
  2721. D_S[d].CDsize_frm=D_S[d].size_blk+1;
  2722. D_S[d].n_first_track=infobuf[2];
  2723. D_S[d].n_last_track=infobuf[3];
  2724. }
  2725. else
  2726. {
  2727. D_S[d].n_first_track=infobuf[1];
  2728. D_S[d].n_last_track=infobuf[2];
  2729. D_S[d].size_msf=make32(make16(0,infobuf[3]),make16(infobuf[4],infobuf[5]));
  2730. D_S[d].size_blk=msf2blk(D_S[d].size_msf);
  2731. if (famLV_drive) D_S[d].CDsize_frm=D_S[d].size_blk+1;
  2732. }
  2733. D_S[d].diskstate_flags |= toc_bit;
  2734. msg(DBG_TOC,"TocDesc: xa %02X firstt %02X lastt %02X size %08X firstses %02X lastsess %02Xn",
  2735.     D_S[d].xa_byte,
  2736.     D_S[d].n_first_track,
  2737.     D_S[d].n_last_track,
  2738.     D_S[d].size_msf,
  2739.     D_S[d].first_session,
  2740.     D_S[d].last_session);
  2741. return (0);
  2742. }
  2743. /*==========================================================================*/
  2744. static int cc_ReadTocEntry(int num)
  2745. {
  2746. int i;
  2747. clr_cmdbuf();
  2748. if (fam1_drive)
  2749. {
  2750. drvcmd[0]=CMD1_READTOC;
  2751. drvcmd[2]=num;
  2752. response_count=8;
  2753. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2754. }
  2755. else if (fam2_drive)
  2756. {
  2757. /* possibly longer timeout periods necessary */
  2758. drvcmd[0]=CMD2_DISKINFO;
  2759. drvcmd[1]=0x02;
  2760. drvcmd[2]=num;
  2761. response_count=5;
  2762. flags_cmd_out=f_putcmd;
  2763. }
  2764. else if (fam0LV_drive)
  2765. {
  2766. drvcmd[0]=CMD0_READTOC;
  2767. drvcmd[1]=0x02;
  2768. drvcmd[2]=num;
  2769. response_count=8;
  2770. if (famLV_drive)
  2771. flags_cmd_out=f_putcmd;
  2772. else
  2773.   flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2774. }
  2775. else if (famT_drive)
  2776. {
  2777. response_count=12;
  2778. drvcmd[0]=CMDT_DISKINFO;
  2779. drvcmd[1]=0x02;
  2780. drvcmd[6]=num;
  2781. drvcmd[8]=response_count;
  2782. drvcmd[9]=0x00;
  2783. }
  2784. i=cmd_out();
  2785. if (i<0) return (i);
  2786. if ((famT_drive)&&(i<response_count)) return (-100-i);
  2787. if ((fam1_drive)||(fam0LV_drive))
  2788. {
  2789. D_S[d].TocEnt_nixbyte=infobuf[0];
  2790. i=1;
  2791. }
  2792. else if (fam2_drive) i=0;
  2793. else if (famT_drive) i=5;
  2794. D_S[d].TocEnt_ctl_adr=swap_nibbles(infobuf[i++]);
  2795. if ((fam1_drive)||(fam0L_drive))
  2796. {
  2797. D_S[d].TocEnt_number=infobuf[i++];
  2798. D_S[d].TocEnt_format=infobuf[i];
  2799. }
  2800. else
  2801.   {
  2802.     D_S[d].TocEnt_number=num;
  2803.     D_S[d].TocEnt_format=0;
  2804.   }
  2805. if (fam1_drive) i=4;
  2806. else if (fam0LV_drive) i=5;
  2807. else if (fam2_drive) i=2;
  2808. else if (famT_drive) i=9;
  2809. D_S[d].TocEnt_address=make32(make16(0,infobuf[i]),
  2810.      make16(infobuf[i+1],infobuf[i+2]));
  2811. for (i=0;i<response_count;i++)
  2812. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  2813. msgbuf[i*3]=0;
  2814. msg(DBG_ECS,"TocEntry:%sn", msgbuf);
  2815. msg(DBG_TOC,"TocEntry: %02X %02X %02X %02X %08Xn",
  2816.     D_S[d].TocEnt_nixbyte, D_S[d].TocEnt_ctl_adr,
  2817.     D_S[d].TocEnt_number, D_S[d].TocEnt_format,
  2818.     D_S[d].TocEnt_address);
  2819. return (0);
  2820. }
  2821. /*==========================================================================*/
  2822. static int cc_ReadPacket(void)
  2823. {
  2824. int i;
  2825. clr_cmdbuf();
  2826. drvcmd[0]=CMD0_PACKET;
  2827. drvcmd[1]=response_count;
  2828. if(famL_drive) flags_cmd_out=f_putcmd;
  2829. else if (fam01_drive)
  2830. flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
  2831. else if (fam2_drive) return (-1); /* not implemented yet */
  2832. else if (famT_drive)
  2833. {
  2834. return (-1);
  2835. }
  2836. i=cmd_out();
  2837. return (i);
  2838. }
  2839. /*==========================================================================*/
  2840. static int convert_UPC(u_char *p)
  2841. {
  2842. int i;
  2843. p++;
  2844. if (fam0L_drive) p[13]=0;
  2845. for (i=0;i<7;i++)
  2846. {
  2847. if (fam1_drive) D_S[d].UPC_buf[i]=swap_nibbles(*p++);
  2848. else if (fam0L_drive)
  2849. {
  2850. D_S[d].UPC_buf[i]=((*p++)<<4)&0xFF;
  2851. D_S[d].UPC_buf[i] |= *p++;
  2852. }
  2853. else if (famT_drive)
  2854. {
  2855. return (-1);
  2856. }
  2857. else /* CD200 */
  2858. {
  2859. return (-1);
  2860. }
  2861. }
  2862. D_S[d].UPC_buf[6] &= 0xF0;
  2863. return (0);
  2864. }
  2865. /*==========================================================================*/
  2866. static int cc_ReadUPC(void)
  2867. {
  2868. int i;
  2869. #if TEST_UPC
  2870. int block, checksum;
  2871. #endif /* TEST_UPC */ 
  2872. if (fam2_drive) return (0); /* not implemented yet */
  2873. if (famT_drive) return (0); /* not implemented yet */
  2874. if (famV_drive) return (0); /* not implemented yet */
  2875. #if 1
  2876. if (fam0_drive) return (0); /* but it should work */
  2877. #endif
  2878. D_S[d].diskstate_flags &= ~upc_bit;
  2879. #if TEST_UPC
  2880. for (block=CD_MSF_OFFSET+1;block<CD_MSF_OFFSET+200;block++)
  2881. {
  2882. #endif /* TEST_UPC */ 
  2883. clr_cmdbuf();
  2884. if (fam1_drive)
  2885. {
  2886. drvcmd[0]=CMD1_READ_UPC;
  2887. #if TEST_UPC
  2888. drvcmd[1]=(block>>16)&0xFF;
  2889. drvcmd[2]=(block>>8)&0xFF;
  2890. drvcmd[3]=block&0xFF;
  2891. #endif /* TEST_UPC */ 
  2892. response_count=8;
  2893. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  2894. }
  2895. else if (fam0L_drive)
  2896. {
  2897. drvcmd[0]=CMD0_READ_UPC;
  2898. #if TEST_UPC
  2899. drvcmd[2]=(block>>16)&0xFF;