Commit 27fc11ad authored by Linus Torvalds's avatar Linus Torvalds

Import 1.3.63

parent 9fe6314a
......@@ -366,6 +366,13 @@ N: Philip Gladstone
E: philipg@onsett.com
D: Kernel / timekeeping stuff
N: Danny ter Haar
E: dth@cistron.nl
D: /proc/procinfo, reboot on panic , kernel pre-patch tester ;)
S: PObox 297
S: 2400 AG, Alphen aan den Rijn
S: The Netherlands
N: Bruno Haible
E: haible@ma2s2.mathematik.uni-karlsruhe.de
D: Unified SysV FS based on Xenix FS (part of standard kernel since 0.99.15)
......
This diff is collapsed.
-- Documentation/cdrom/isp16
Docs by Eric van der Maarel <H.T.M.v.d.Maarel@marin.nl>
This is the README for version 0.6 of the cdrom interface on an
ISP16, MAD16 or Mozart sound card.
The detection and configuration of this interface used to be included
in both the sjcd and optcd cdrom driver. Drives supported by these
drivers came packed with Media Magic's multi media kit, which also
included the ISP16 card. The idea (thanks Leo Spiekman)
to move it from thes drivers into a separate module and moreover, not to
rely on the MAD16 sound driver, are as follows:
-duplication of code in the kernel is a waste of resources and should
be avoided;
-however, kernels and notably those included with Linux distributions
(cf Slackware 3.0 included version 0.5 of the isp16 configuration
code included in the drivers) don't always come with sound support
included. Especially when they already include a bunch of cdrom drivers.
Hence, the cdrom interface should be configurable _independently_ of
sound support.
The ISP16, MAD16 and Mozart sound cards have an OPTi 82C928 or an
OPTi 82C929 chip. The interface on these cards should work with
any cdrom attached to the card, which is 'electrically' compatible
with Sanyo/Panasonic, Sony or Mitsumi non-ide drives. However, the
command sets for any propriatary drives may differ
(and hence may not be supported in the kernel) from these four types.
For a fact I know the interface works and the way of configuration
as described in this documentation works in combination with the
sjcd (in Sanyo/Panasonic compatibility mode) cdrom drivers
(probably with the optcd (in Sony compatibility mode) as well).
If you have such an OPTi based sound card and you want to use the
cdrom interface with a cdrom drive supported by any of the other cdrom
drivers, it will probably work. Please let me know any experience you
might have).
I understand that cards based on the OPTi 82C929 chips may be configured
(hardware jumpers that is) as an IDE interface. Initialisation of such a
card in this mode is not supported (yet?).
The suggestion to configure the ISP16 etc. sound card by booting DOS and
do a warm reboot to boot Linux somehow doesn't work, at least not
on my machine (IPC P90), with the OPTi 82C928 based card.
Booting the kernel through the boot manager LILO allows the use
of some command line options on the 'LILO boot:' prompt. At boot time
press Alt or Shift while the LILO prompt is written on the screen and enter
any kernel options. Alternatively these options may be used in
the apropriate section in /etc/lilo.conf. Adding 'append="<cmd_line_options>"'
will do the trick as well.
The syntax of 'cmd_line_options' is
isp16=[<port>[,<irq>[,<dma>]]][[,]<drive_type>]
If there is no ISP16 or compatibles detected, there's probably no harm done.
These options indicate the values that your cdrom drive has been (or will be)
configured to use.
Valid values for the base i/o address are:
port=0x340,0x320,0x330,0x360
for the interrupt request number
irq=0,3,5,7,9,10,11
for the direct memory access line
dma=0,3,5,6,7
and for the type of drive
drive_type=noisp16,Sanyo,Panasonic,Sony,Mitsumi.
Note that these options are case sensitive.
The values 0 for irq and dma indicate that they are not used, and
the drive will be used in 'polling' mode. The values 5 and 7 for irq
should be avoided in order to avoid any conflicts with optional
sound card configuration.
The syntax of the command line does not allow the specifiaction of
irq when there's nothing specified for the base address and no
specification of dma when there is no specification of irq.
The value 'nosip16' for drive_type, which may be used as the first
non-integer option value (e.g. 'isp16=noisp16'), makes sure that probing
for and subsequent configuration of an ISP16-compatible card is skipped
all together. This can be useful to overcome possible conflicts which
may arise while the kernel is probing your hardware.
The default values are
port=0x340
irq=0
dma=0
drive_type=Sanyo
reflecting my own configuration. The defaults can be changed in
the file ~/include/linux/ips16.h.
The cdrom interface can be configured at run time by loading the
initialisation driver as a module. In that case, the interface
parameters can be set by giving appropriate values on the command
line. Configuring the driver can then be done by the following
command (assuming you have iso16.o installed in a proper place):
insmod isp16.o isp16_cdrom_base=<port> isp16_cdrom_irq=<irq> \
isp16_cdrom_dma=<dma> isp16_cdrom_type=<drive_type>
where port, irq, dma and drive_type can have any of the values mentioned
above.
Have fun!
-- README.sjcd
-- Documentation/cdrom/sjcd
80% of the work takes 20% of the time,
20% of the work takes 80% of the time...
(Murphy law)
......@@ -6,57 +6,24 @@
Once started, training can not be stopped...
(StarWars)
This is the README for the sjcd cdrom driver, version 1.5.
This is the README for the sjcd cdrom driver, version 1.6.
This file is meant as a tips & tricks edge for the usage of the SANYO CDR-H94A
cdrom drive. It will grow as the questions arise. ;-)
Since the drive often comes with an ISP16 soundcard, which can be used
as cdrom interface, this is also the place for ISP16 related issues.
For info on configuring the ISP16 sound card look at Documetation/cdrom/isp16.
The driver should work with any SoundBlaster/Panasonic style CDROM interface,
including the "soft configurable" MediaMagic sound card.
To make this sound card (and others like "Mozart") working, it has to get
"configured" by software.
The suggestion to configure the ISP16 soundcard by booting DOS and
a warm reboot to boot Linux somehow doesn't work, at least not
on Eric's machine (IPC P90), with the version of the ISP16
card he has (there appear to be at least two versions: Eric's card with
no jumpered IDE support and OPTi 82C928 chip, and Vadim's version
with a jumper to enable IDE support, probably with a OPTi 82C929 chip).
Therefore detection and configuration of the ISP16 interfaces is included
in the driver.
If we should support any other interfaces (which cannot be configured
through DOS) or if there are any more ISP16 types, please let us
know (maarel@marin.nl) and we'll see.
Otherwise, you should boot DOS once (and by this, run the "configuration driver")
and then switch to Linux by use of CTRL-ALT-DEL. Each use of the RESET
button or the power switch makes this procedure necessary again.
If no ISP16 is detected, there's no harm done; a card configured trough DOS
may still work as expected.
As of version 1.4 sound through the speakers is supported; only for MSS-mode
and no volume controle yet.
PAUSE and STOP ioctl commands don't seem to work yet.
ISP16 configuration routines reside at Vadim's server
ftp.rbrf.ru:/linux/mediamagic/
and at Eberhard's mirror
ftp.gwdg.de:/pub/linux/cdrom/drivers/sanyo/
Leo Spiekman's configuration routines for the ISP-16 card can get found at
dutette.et.tudelft.nl:/pub/linux/
and at Eberhard's mirror
ftp.gwdg.de:/pub/linux/cdrom/drivers/optics/
Eric van der Maarel's routines are included in sjcd.c.
This, and any related stuff may be found by anonymous ftp at
ftp.gwdg.de:/pub/linux/cdrom/drivers/sanyo/
The driver should work with any of the Panasonic, Sony or Mitsum style
CDROM interface.
The cdrom interface on Media Magic's soft configurable sound card ISP16,
which used to be included in the driver, is now supported in a separate module.
This initilisation module will probably also work with other interfaces
based on an OPTi 82C928 or 82C929 chip (like MAD16 and Mozart): see the
documentation Documentation/cdrom/isp16.
The device major for sjcd is 18, and minor is 0. Create a block special
file in your /dev directory (e.g., /dev/sjcd) with these numbers.
(For those who don't know, being root and doing the following should do the trick:
(For those who don't know, being root and doing the following should do
the trick:
mknod -m 644 /dev/sjcd b 18 0
and mount the cdrom by /dev/sjcd).
......@@ -64,17 +31,30 @@ The default configuration parameters are:
base address 0x340
no irq
no dma
As of version 1.2, setting base address, irq and dma at boot time is supported
(Acctulay the CDR-H94A doesn't know how to use irq and dma.)
As of version 1.2, setting base address at boot time is supported
through the use of command line options: type at the "boot:" prompt:
linux sjcd=<base address>,<irq>,<dma>
(where your kernel is assumed to be called by saying "linux" to
the boot manager).
linux sjcd=<base_address>
(where you would use the kernel labeled "linux" in lilo's configuration
file /etc/lilo.conf). You could also use 'append="sjcd=<configuration_info>"'
in the appropriate section of /etc/lilo.conf
If you're building a kernel yourself you can set your default base
i/o address with SJCD_BASE_ADDR in include/linux/sjcd.h.
The sjcd driver supports beng loaded as a module. The following
command will set the base i/o address on the fly (assuming you
have installed the module in an appropriate place).
insmod sjcd.o sjcd_base=<base_address>
Have fun!
If something is wrong, e-mail to vadim@rbrf.ru
If something is wrong, please email to vadim@rbrf.ru
or vadim@ipsun.ras.ru
or model@cecmow.enet.dec.com
or H.T.M.v.d.Maarel@marin.nl
It happens sometimes that Vadim is not reachable by mail. For these
instances, Eric van der Maarel (maarel@marin.nl) will help, too.
instances, Eric van der Maarel will help too.
Vadim V. Model, Eric van der Maarel, Eberhard Moenkeberg
......@@ -51,6 +51,7 @@ The set of modules is rapidly increasing, but so far these are known:
gscd: Goldstar GCDR-420
mcd, mcdx: Mitsumi LU005, FX001
optcd: Optics Storage Dolphin 8000AT
sjcd: Sanyo CDR-H94A
sbpcd: Matsushita/Panasonic CR52x, CR56x, CD200,
Longshine LCS-7260, TEAC CD-55A
sonycd535: Sony CDU-531/535, CDU-510/515
......@@ -58,6 +59,7 @@ The set of modules is rapidly increasing, but so far these are known:
Some misc modules:
lp: line printer
binfmt_elf: elf loader
isp16: cdrom interface
When you have made the kernel, you create the modules by doing:
......
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 62
SUBLEVEL = 63
ARCH = i386
......
......@@ -27,21 +27,20 @@ CONFIG_M586=y
# CONFIG_M686 is not set
#
# Block devices
# Floppy, IDE, and other block devices
#
CONFIG_BLK_DEV_FD=y
# CONFIG_BLK_DEV_RAM is not set
CONFIG_ST506=y
CONFIG_BLK_DEV_IDE=y
#
# Please see drivers/block/README.ide for help/info on IDE drives
#
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDE=y
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set
CONFIG_BLK_DEV_RZ1000=y
CONFIG_BLK_DEV_CMD640=y
CONFIG_BLK_DEV_RZ1000=y
# CONFIG_BLK_DEV_TRITON is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_BLK_DEV_XD is not set
......
......@@ -245,7 +245,8 @@ if [ "$CONFIG_CD_NO_IDESCSI" = "y" ]; then
tristate 'Goldstar R420 CDROM support' CONFIG_GSCD n
tristate 'Philips/LMS CM206 CDROM support' CONFIG_CM206 n
tristate 'Experimental Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD n
bool 'Experimental Sanyo H94A CDROM support' CONFIG_SJCD n
tristate 'Sanyo CDR-H94A CDROM support' CONFIG_SJCD n
bool 'ISP16/MAD16/Mozart soft configurable cdrom interface support' CONFIG_ISP16_CDI n
fi
comment 'Filesystems'
......
......@@ -2,38 +2,36 @@
# Block device driver configuration
#
mainmenu_option next_comment
comment 'Block devices'
comment 'Floppy, IDE, and other block devices'
tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD
tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
bool 'Normal (MFM/RLL) disk and IDE disk/cdrom support' CONFIG_ST506
if [ "$CONFIG_ST506" = "y" ]; then
comment 'Please see drivers/block/README.ide for help/info on IDE drives'
bool ' Use old disk-only driver for primary i/f' CONFIG_BLK_DEV_HD
if [ "$CONFIG_BLK_DEV_HD" = "y" ]; then
bool ' Include new IDE driver for secondary i/f support' CONFIG_BLK_DEV_IDE
else
bool ' Use new IDE driver for primary/secondary i/f' CONFIG_BLK_DEV_IDE
fi
if [ "$CONFIG_BLK_DEV_IDE" = "y" ]; then
bool ' Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD
bool ' Include (ALPHA) IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE
bool 'Enhanced IDE/MFM/RLL disk/cdrom/tape support' CONFIG_BLK_DEV_IDE
comment 'Please see drivers/block/README.ide for help/info on IDE drives'
if [ "$CONFIG_BLK_DEV_IDE" = "n" ]; then
bool 'Old harddisk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY
else
bool ' Use old disk-only driver on primary interface' CONFIG_BLK_DEV_HD_IDE
bool ' Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD
bool ' Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE
bool ' CMD640 chipset bugfix/support' CONFIG_BLK_DEV_CMD640
if [ "$CONFIG_PCI" = "y" ]; then
bool ' RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000
bool ' CMD640 chipset bugfix/support' CONFIG_BLK_DEV_CMD640
if [ "$CONFIG_PCI" = "y" ]; then
bool ' TRITON chipset DMA support' CONFIG_BLK_DEV_TRITON
fi
bool ' Other IDE chipset support' CONFIG_IDE_CHIPSETS
if [ "$CONFIG_IDE_CHIPSETS" = "y" ]; then
comment 'Note: most of these also require special kernel boot parameters'
bool ' DTC2278 chipset support' CONFIG_BLK_DEV_DTC2278
bool ' HT6560B chipset support' CONFIG_BLK_DEV_HT6560B
bool ' QD6580 chipset support' CONFIG_BLK_DEV_QD6580
bool ' UMC8672 chipset support' CONFIG_BLK_DEV_UMC8672
bool ' ALI14XX chipset support' CONFIG_BLK_DEV_ALI14XX
fi
bool ' Intel 430FX (Triton) chipset DMA support' CONFIG_BLK_DEV_TRITON
fi
bool ' Other IDE chipset support' CONFIG_IDE_CHIPSETS
if [ "$CONFIG_IDE_CHIPSETS" = "y" ]; then
comment 'Note: most of these also require special kernel boot parameters'
bool ' DTC-2278 chipset support' CONFIG_BLK_DEV_DTC2278
bool ' Holtek HT6560B chipset support' CONFIG_BLK_DEV_HT6560B
bool ' QDI QD6580 chipset support' CONFIG_BLK_DEV_QD6580
bool ' UMC 8672 chipset support' CONFIG_BLK_DEV_UMC8672
bool ' ALI M1439/M1445 chipset support' CONFIG_BLK_DEV_ALI14XX
fi
fi
if [ "$CONFIG_BLK_DEV_HD_IDE" = "y" -o "$CONFIG_BLK_DEV_HD_ONLY" = "y" ]; then
define_bool CONFIG_BLK_DEV_HD y
fi
bool 'XT harddisk support' CONFIG_BLK_DEV_XD
endmenu
......@@ -58,6 +58,7 @@ NEW! - Bus-Master DMA support for Intel PCI Triton chipset IDE interfaces
NEW! - ide-cd.c now supports door locking and auto-loading.
- Also preliminary support for multisession
and direct reads of audio data.
NEW! - the hdparm-2.6 package can be used to set PIO modes for some chipsets.
For work in progress, see the comments in ide.c, ide-cd.c, and triton.c.
......@@ -260,7 +261,7 @@ Summary of ide driver parameters for kernel "command line":
"ide0=cmd640_vlb" : *REQUIRED* for VLB cards with the CMD640 chip
(not for PCI -- automatically detected)
"ide0=qd6580" : probe/support qd6580 interface
"ide0=ali14xx" : probe/support ali14xx chipsets (ALI M1439, M1443, M1445)
"ide0=ali14xx" : probe/support ali14xx chipsets (ALI M1439/M1445)
"ide0=umc8672" : probe/support umc8672 chipsets
Everything else is rejected with a "BAD OPTION" message.
......@@ -428,6 +429,25 @@ more generally compatible method of achieving the same results (DOS access
to the entire disk). However, if you must use DiskManager, it now works
with Linux 1.3.x in most cases. Let me know if you still have trouble.
My recommendations to anyone who asks about NEW systems are:
- buy a motherboard that uses the Intel Triton chipset -- very common.
- use IDE for the first two drives, placing them on separate interfaces.
- place the IDE cdrom drive as slave on either interface.
- if additional disks are to be connected, consider your needs:
- fileserver? Buy a SC200 SCSI adaptor for the next few drives.
- personal system? Use IDE for the next two drives.
- still not enough? Keep adding SC200 SCSI cards as needed.
Most manufacturers make both IDE and SCSI-2 versions of each of their drives.
The IDE ones are usually faster and cheaper, due to the higher data transfer
speed of PIO mode4 (ATA2), 16.6MBytes/sec versus 10Mbytes/sec for SCSI-2.
In particular, I recommend Quantum FireBalls as cheap and exceptionally fast.
The new WD1.6GB models are also cheap screamers.
For really high end systems, go for fast/wide 7200rpm SCSI. But it'll cost ya!
mlord@bnr.ca
================================================================================
......
/*
* linux/drivers/block/ali14xx.c Version 0.01 Feb 06, 1996
* linux/drivers/block/ali14xx.c Version 0.03 Feb 09, 1996
*
* Copyright (C) 1996 Linus Torvalds & author (see below)
*/
......@@ -37,8 +37,21 @@
#include <linux/hdreg.h>
#include <asm/io.h>
#include "ide.h"
#include "ide_modes.h"
#define ALI_14xx_BUS_SPEED 40 /* PCI / VLB bus speed */
/*
* This should be set to the system's local bus (PCI or VLB) speed,
* e.g., 33 for a 486DX33 or 486DX2/66. Legal values are anything
* from 25 to 50. Setting this too *low* will make the EIDE
* controller unable to communicate with the disks.
*
* I suggest using a default of 50, since it should work ok with any
* system. (Low values cause problems because it multiplies by bus speed
* to get cycles, and thus gets a too-small cycle count and tries to
* access the disks too fast. I tried this once under DOS and it locked
* up the system.) -- derekn@vw.ece.cmu.edu
*/
#define ALI_14xx_BUS_SPEED 50 /* PCI / VLB bus speed */
/* port addresses for auto-detection */
#define ALI_NUM_PORTS 4
......@@ -112,11 +125,11 @@ static void ali14xx_tune_drive (ide_drive_t *drive, byte pio)
struct hd_driveid *id = drive->id;
unsigned long flags;
if (pio == 255) { /* auto-tune */
pio = id->tPIO;
if ((id->field_valid & 0x02) && (id->eide_pio_modes & 0x01))
pio = 3;
}
if (pio == 255)
pio = ide_get_best_pio_mode(drive);
if (pio > 3)
pio = 3;
/* calculate timing, according to PIO mode */
time1 = timeTab[pio].time1;
time2 = timeTab[pio].time2;
......
......@@ -56,6 +56,7 @@
#include <linux/hdreg.h>
#include <asm/io.h>
#include "ide.h"
#include "ide_modes.h"
int cmd640_vlb = 0;
......@@ -594,88 +595,10 @@ static struct pio_timing {
{ 50, 125, 383 }, /* PIO Mode 1 */
{ 30, 100, 240 }, /* PIO Mode 2 */
{ 30, 80, 180 }, /* PIO Mode 3 */
{ 25, 70, 125 }, /* PIO Mode 4 */
{ 25, 70, 125 }, /* PIO Mode 4 -- should be 120, not 125 */
{ 20, 50, 100 } /* PIO Mode ? (nonstandard) */
};
/*
* Black list. Some drives incorrectly report their maximal PIO modes, at least
* in respect to CMD640. Here we keep info on some known drives.
*/
static struct drive_pio_info {
const char *name;
int pio;
} drive_pios[] = {
/* { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
{ "WDC AC2700", 3 },
{ "WDC AC2540", 3 },
{ "WDC AC2420", 3 },
{ "WDC AC2340", 3 },
{ "WDC AC2250", 0 },
{ "WDC AC2200", 0 },
{ "WDC AC2120", 0 },
{ "WDC AC2850", 3 },
{ "WDC AC1270", 3 },
{ "WDC AC1170", 3 },
{ "WDC AC1210", 1 },
{ "WDC AC280", 0 },
/* { "WDC AC21000", 4 }, */
{ "WDC AC31000", 3 },
/* { "WDC AC21200", 4 }, */
{ "WDC AC31200", 3 },
/* { "WDC AC31600", 4 }, */
{ "Maxtor 7131 AT", 1 },
{ "Maxtor 7171 AT", 1 },
{ "Maxtor 7213 AT", 1 },
{ "Maxtor 7245 AT", 1 },
{ "Maxtor 7345 AT", 1 },
{ "Maxtor 7546 AT", 3 },
{ "Maxtor 7540 AV", 3 },
{ "SAMSUNG SHD-3121A", 1 },
{ "SAMSUNG SHD-3122A", 1 },
{ "SAMSUNG SHD-3172A", 1 },
/* { "ST51080A", 4 },
* { "ST51270A", 4 },
* { "ST31220A", 4 },
* { "ST31640A", 4 },
* { "ST32140A", 4 },
* { "ST3780A", 4 },
*/ { "ST5660A", 3 },
{ "ST3660A", 3 },
{ "ST3630A", 3 },
{ "ST3655A", 3 },
{ "ST3391A", 3 },
{ "ST3390A", 1 },
{ "ST3600A", 1 },
{ "ST3290A", 0 },
{ "ST3144A", 0 },
{ "QUANTUM ELS127A", 0 },
{ "QUANTUM ELS170A", 0 },
{ "QUANTUM LPS240A", 0 },
{ "QUANTUM LPS210A", 3 },
{ "QUANTUM LPS270A", 3 },
{ "QUANTUM LPS365A", 3 },
{ "QUANTUM LPS540A", 3 },
{ "QUANTUM FIREBALL", 3 }, /* For models 540/640/1080/1280 */
{ NULL, 0 }
};
static int known_drive_pio(char* name) {
struct drive_pio_info* pi;
for (pi = drive_pios; pi->name != NULL; pi++) {
if (strmatch(pi->name, name) == 0)
return pi->pio;
}
return -1;
}
static void cmd640_timings_to_clocks(int mc_time, int av_time, int ds_time,
int clock_time, int drv_idx)
{
......@@ -764,7 +687,7 @@ static void cmd640_tune_drive(ide_drive_t *drive, byte pio_mode) {
drive_number = drive->select.b.unit;
clock_time = 1000/bus_speed;
id = drive->id;
if ((max_pio = known_drive_pio(id->model)) != -1) {
if ((max_pio = ide_scan_pio_blacklist(id->model)) != -1) {
ds_time = pio_timings[max_pio].ds_time;
} else {
max_pio = id->tPIO;
......
/*
* linux/drivers/block/dtc2278.c Version 0.01 Feb 06, 1996
* linux/drivers/block/dtc2278.c Version 0.02 Feb 10, 1996
*
* Copyright (C) 1996 Linus Torvalds & author (see below)
*/
......@@ -16,6 +16,12 @@
#include <linux/hdreg.h>
#include <asm/io.h>
#include "ide.h"
#include "ide_modes.h"
/*
* Changing this #undef to #define may solve start up problems in some systems.
*/
#undef ALWAYS_SET_DTC2278_PIO_MODE
/*
* From: andy@cercle.cts.com (Dyan Wile)
......@@ -27,9 +33,9 @@
* /dev/hd.. ) for the drives connected to the EIDE interface. (I get my
* filesystem corrupted with -u1, but under heavy disk load only :-)
*
* From: mlord@bnr.ca -- this chipset is now forced to use the "serialize" feature,
* which hopefully will make it more reliable to use.. maybe it has the same bugs
* as the CMD640B and RZ1000 ??
* This chipset is now forced to use the "serialize" feature,
* and irq-unmasking is disallowed. If io_32bit is enabled,
* it must be done for BOTH drives on each interface.
*/
static void sub22 (char b, char c)
......@@ -50,24 +56,31 @@ static void sub22 (char b, char c)
}
}
static void tune_dtc2278 (ide_drive_t *drive, byte pio_mode)
static void tune_dtc2278 (ide_drive_t *drive, byte pio)
{
unsigned long flags;
if (pio_mode != 255) { /* auto-tune not yet supported here */
if (pio_mode >= 3) {
save_flags(flags);
cli();
/*
* This enables PIO mode4 (3?) on the first interface
*/
sub22(1,0xc3);
sub22(0,0xa0);
restore_flags(flags);
} else {
/* we don't know how to set it back again.. */
}
if (pio == 255)
pio = ide_get_best_pio_mode(drive);
if (pio >= 3) {
save_flags(flags);
cli();
/*
* This enables PIO mode4 (3?) on the first interface
*/
sub22(1,0xc3);
sub22(0,0xa0);
restore_flags(flags);
} else {
/* we don't know how to set it back again.. */
}
/*
* 32bit I/O has to be enabled for *both* drives at the same time.
*/
drive->io_32bit = 1;
HWIF(drive)->drives[!drive->select.b.unit].io_32bit = 1;
}
void init_dtc2278 (void)
......@@ -83,10 +96,20 @@ void init_dtc2278 (void)
inb(0x3f6);
outb_p(0x20,0xb4);
inb(0x3f6);
#ifdef ALWAYS_SET_DTC2278_PIO_MODE
/*
* This enables PIO mode4 (3?) on the first interface
* and may solve start-up problems for some people.
*/
sub22(1,0xc3);
sub22(0,0xa0);
#endif
restore_flags(flags);
ide_hwifs[0].serialized = 1;
ide_hwifs[0].chipset = ide_dtc2278;
ide_hwifs[1].chipset = ide_dtc2278;
ide_hwifs[0].tuneproc = &tune_dtc2278;
ide_hwifs[0].no_unmask = 1;
ide_hwifs[1].no_unmask = 1;
}
/*
* linux/drivers/block/ht6580.c Version 0.01 Feb 06, 1996
* linux/drivers/block/ht6580.c Version 0.03 Feb 09, 1996
*
* Copyright (C) 1995-1996 Linus Torvalds & author (see below)
*/
/*
*
* Version 0.01 Initial version hacked out of ide.c
*
* Version 0.02 Added support for PIO modes, auto-tune
*
* Version 0.03 Some cleanups
*
* I reviewed some assembler sourcer listings of htide drivers and found
* out how they setup those cycle time interfacing values, as they at Holtek
* call them. IDESETUP.COM that is supplied with the drivers figures out
* optimal values and fetches those values to drivers. I found out that
* they use IDE_SELECT_REG to fetch timings to the ide board right after
* interface switching. After that it was quite easy to add code to
* ht6560b.c.
*
* IDESETUP.COM gave me values 0x24, 0x45, 0xaa, 0xff that worked fine
* for hda and hdc. But hdb needed higher values to work, so I guess
* that sometimes it is necessary to give higher value than IDESETUP
* gives. [see cmd640.c for an extreme example of this. -ml]
*
* Perhaps I should explain something about these timing values:
* The higher nibble of value is the Recovery Time (rt) and the lower nibble
* of the value is the Active Time (at). Minimum value 2 is the fastest and
* the maximum value 15 is the slowest. Default values should be 15 for both.
* So 0x24 means 2 for rt and 4 for at. Each of the drives should have
* both values, and IDESETUP gives automatically rt=15 st=15 for cdroms or
* similar. If value is too small there will be all sorts of failures.
*
* Port 0x3e6 bit 0x20 sets these timings on/off. If 0x20 bit is set
* these timings are disabled.
*
* Mikko Ala-Fossi
*
* More notes:
*
* There's something still missing from the initialization code, though.
* If I have booted to dos sometime after power on, I can get smaller
* timing values working. Perhaps I could soft-ice the initialization.
*
* OS/2 driver seems to use some kind of DMA. But that code is really
* messy to me to found out how.
*
* -=- malafoss@snakemail.hut.fi -=- searching the marvels of universe -=-
*/
#undef REALLY_SLOW_IO /* most systems can safely undef this */
#include <linux/types.h>
......@@ -16,6 +62,7 @@
#include <linux/hdreg.h>
#include <asm/io.h>
#include "ide.h"
#include "ide_modes.h"
/*
* This routine handles interface switching for the peculiar hardware design
......@@ -30,34 +77,81 @@
* a read-modify-write sequence, so as not to disturb other bits in the reg?
*/
/*
* The special i/o-port that HT-6560B uses to select interfaces:
*/
#define HT_SELECT_PORT 0x3e6
/*
* We don't know what all of the bits are for, but we *do* know about these:
* bit5 (0x20): "1" selects slower speed (?)
* bit5 (0x20): "1" selects slower speed by disabling use of timing values
* bit0 (0x01): "1" selects second interface
*/
static byte qd6560b_selects [2][MAX_DRIVES] = {{0x3c,0x3c}, {0x3d,0x3d}};
static byte ht6560b_selects [2][MAX_DRIVES] = {{0x3c,0x3c}, {0x3d,0x3d}};
static void qd6560b_selectproc (ide_drive_t *drive) /* called from ide.c */
/*
* VLB ht6560b Timing values:
*
* Timing byte consists of
* High nibble: Recovery Time (rt)
* The valid values range from 2 to 15. The default is 15.
*
* Low nibble: Active Time (at)
* The valid values range from 2 to 15. The default is 15.
*
* You can obtain optimized timing values by running Holtek IDESETUP.COM
* for DOS. DOS drivers get their timing values from command line, where
* the first value is the Recovery Time and the second value is the
* Active Time for each drive. Smaller value gives higher speed.
* In case of failures you should probably fall back to a higher value.
*
* Hopefully this example will make it clearer:
*
* DOS: DEVICE=C:\bin\HTIDE\HTIDE.SYS /D0=2,4 /D1=4,5 /D2=10,10 /D3=15,15
* Linux: byte ht6560b_timings [][] = {{0x24, 0x45}, {0xaa, 0xff}};
*
* Note: There are no ioctls to change these values directly,
* but settings can be approximated as PIO modes, using "hdparm":
*
* rc.local: hdparm -p3 /dev/hda -p2 /dev/hdb -p1 /dev/hdc -p0 /dev/hdd
*/
static byte ht6560b_timings [2][MAX_DRIVES] = {{0xff,0xff}, {0xff,0xff}};
static byte pio_to_timings[6] = {0xff, 0xaa, 0x45, 0x24, 0x13, 0x12};
/*
* This routine is invoked from ide.c to prepare for access to a given drive.
*/
static void ht6560b_selectproc (ide_drive_t *drive)
{
byte t;
unsigned long flags;
static byte current_select = 0;
byte drive_select = qd6560b_selects[HWIF(drive)->index][drive->select.b.unit];
static byte current_timing = 0;
byte select = ht6560b_selects[HWIF(drive)->index][drive->select.b.unit];
byte timing = ht6560b_timings[HWIF(drive)->index][drive->select.b.unit];
if (drive_select != current_select) {
byte t;
unsigned long flags;
if (select != current_select || timing != current_timing) {
current_select = select;
current_timing = timing;
save_flags (flags);
cli();
current_select = drive_select;
(void) inb(0x3e6);
(void) inb(0x3e6);
(void) inb(0x3e6);
(void) inb(HT_SELECT_PORT);
(void) inb(HT_SELECT_PORT);
(void) inb(HT_SELECT_PORT);
/*
* Note: input bits are reversed to output bits!!
*/
t = inb(0x3e6) ^ 0x3f;
t = inb(HT_SELECT_PORT) ^ 0x3f;
t &= (~0x21);
t |= (current_select & 0x21);
outb(t,0x3e6);
outb(t, HT_SELECT_PORT);
/*
* Set timing for this drive:
*/
outb (timing, IDE_SELECT_REG);
(void) inb (IDE_STATUS_REG);
restore_flags (flags);
}
}
......@@ -71,28 +165,29 @@ int try_to_init_ht6560b(void)
int i;
/* Autodetect ht6560b */
if ((orig_value=inb(0x3e6)) == 0xff)
if ((orig_value=inb(HT_SELECT_PORT)) == 0xff)
return 0;
for (i=3;i>0;i--) {
outb(0x00,0x3e6);
if (!( (~inb(0x3e6)) & 0x3f )) {
outb(orig_value,0x3e6);
outb(0x00, HT_SELECT_PORT);
if (!( (~inb(HT_SELECT_PORT)) & 0x3f )) {
outb(orig_value, HT_SELECT_PORT);
return 0;
}
}
outb(0x00,0x3e6);
if ((~inb(0x3e6))& 0x3f) {
outb(orig_value,0x3e6);
outb(0x00, HT_SELECT_PORT);
if ((~inb(HT_SELECT_PORT))& 0x3f) {
outb(orig_value, HT_SELECT_PORT);
return 0;
}
/*
/*
* Ht6560b autodetected:
* reverse input bits to output bits
* initialize bit1 to 0
*/
outb((orig_value ^ 0x3f) & 0xfd,0x3e6);
printk("ht6560b: detected and initialized\n");
outb((orig_value ^ 0x3f) & 0xfd, HT_SELECT_PORT);
printk("\nht6560b: detected and initialized");
return 1;
}
......@@ -101,37 +196,37 @@ static void tune_ht6560b (ide_drive_t *drive, byte pio)
unsigned int hwif, unit;
if (pio == 255) { /* auto-tune */
if (drive->media != ide_disk) {
pio = 0; /* cdroms don't like our fast mode */
} else {
struct hd_driveid *id = drive->id;
pio = id->tPIO;
if ((id->field_valid & 0x02) && (id->eide_pio_modes & 0x01))
pio = 3;
}
if (drive->media != ide_disk)
pio = 0; /* some cdroms don't like fast modes (?) */
else
pio = ide_get_best_pio_mode (drive);
}
hwif = HWIF(drive)->index;
if (pio > 5)
pio = 5;
unit = drive->select.b.unit;
if (pio < 3)
qd6560b_selects[hwif][unit] |= 0x20;
hwif = HWIF(drive)->index;
ht6560b_timings[hwif][unit] = pio_to_timings[pio];
if (pio == 0)
ht6560b_selects[hwif][unit] |= 0x20;
else
qd6560b_selects[hwif][unit] &= ~0x20;
ht6560b_selects[hwif][unit] &= ~0x20;
}
void init_ht6560b (void)
{
if (check_region(0x3e6,1)) {
if (check_region(HT_SELECT_PORT,1)) {
printk("\nht6560b: PORT 0x3e6 ALREADY IN USE\n");
} else {
if (try_to_init_ht6560b()) {
request_region(0x3e6, 1, "ht6560b");
request_region(HT_SELECT_PORT, 1, ide_hwifs[0].name);
ide_hwifs[0].chipset = ide_ht6560b;
ide_hwifs[1].chipset = ide_ht6560b;
ide_hwifs[0].selectproc = &qd6560b_selectproc;
ide_hwifs[1].selectproc = &qd6560b_selectproc;
ide_hwifs[0].selectproc = &ht6560b_selectproc;
ide_hwifs[1].selectproc = &ht6560b_selectproc;
ide_hwifs[0].tuneproc = &tune_ht6560b;
ide_hwifs[1].tuneproc = &tune_ht6560b;
ide_hwifs[0].serialized = 1;
}
} else
printk("ht6560b: not found\n");
}
}
......@@ -84,6 +84,8 @@
* Add NO_DOOR_LOCKING configuration option.
* Handle drive_cmd requests w/NULL args (for hdparm -t).
* Work around sporadic Sony55e audio play problem.
* 3.07a Feb 11, 1996 -- check drive->id for NULL before dereferencing, to fix
* problem with "hde=cdrom" with no drive present. -ml
*
* NOTE: Direct audio reads will only work on some types of drive.
* So far, i've received reports of success for Sony and Toshiba drives.
......@@ -2664,8 +2666,12 @@ void ide_cdrom_setup (ide_drive_t *drive)
CDROM_CONFIG_FLAGS (drive)->no_doorlock = 0;
#endif
CDROM_CONFIG_FLAGS (drive)->drq_interrupt =
((drive->id->config & 0x0060) == 0x20);
if (drive->id != NULL) {
CDROM_CONFIG_FLAGS (drive)->drq_interrupt =
((drive->id->config & 0x0060) == 0x20);
} else {
CDROM_CONFIG_FLAGS (drive)->drq_interrupt = 0;
}
#if ! STANDARD_ATAPI
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 0;
......@@ -2674,52 +2680,54 @@ void ide_cdrom_setup (ide_drive_t *drive)
CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 0;
CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 0;
/* Accommodate some broken drives... */
if (strcmp (drive->id->model, "CD220E") == 0 ||
strcmp (drive->id->model, "CD") == 0) /* Creative Labs */
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
else if (strcmp (drive->id->model, "TO-ICSLYAL") == 0 || /* Acer CD525E */
strcmp (drive->id->model, "OTI-SCYLLA") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
if (drive->id != NULL) {
/* Accommodate some broken drives... */
if (strcmp (drive->id->model, "CD220E") == 0 ||
strcmp (drive->id->model, "CD") == 0) /* Creative Labs */
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
/* I don't know who makes this.
Francesco Messineo <sidera@ccii.unipi.it> says this one's broken too. */
else if (strcmp (drive->id->model, "DCI-2S10") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
else if (strcmp (drive->id->model, "TO-ICSLYAL") == 0 || /* Acer CD525E */
strcmp (drive->id->model, "OTI-SCYLLA") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
else if (strcmp (drive->id->model, "CDA26803I SE") == 0) /* Aztech */
{
/* I don't know who makes this.
Francesco Messineo <sidera@ccii.unipi.it> says this one's broken too. */
else if (strcmp (drive->id->model, "DCI-2S10") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
/* This drive _also_ does not implement PLAYAUDIO12 correctly. */
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
}
else if (strcmp (drive->id->model, "CDA26803I SE") == 0) /* Aztech */
{
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
/* Vertos 300.
There seem to be at least two different, incompatible versions
of this drive floating around. Luckily, they appear to return their
id strings with different byte orderings. */
else if (strcmp (drive->id->model, "V003S0DS") == 0)
{
CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 1;
CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 1;
/* This drive _also_ does not implement PLAYAUDIO12 correctly. */
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
}
/* Vertos 300.
There seem to be at least two different, incompatible versions
of this drive floating around. Luckily, they appear to return their
id strings with different byte orderings. */
else if (strcmp (drive->id->model, "V003S0DS") == 0)
{
CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 1;
CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 1;
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
}
else if (strcmp (drive->id->model, "0V300SSD") == 0 ||
strcmp (drive->id->model, "V003M0DP") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
}
else if (strcmp (drive->id->model, "0V300SSD") == 0 ||
strcmp (drive->id->model, "V003M0DP") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
/* Vertos 400. */
else if (strcmp (drive->id->model, "V004E0DT") == 0 ||
strcmp (drive->id->model, "0V400ETD") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
/* Vertos 400. */
else if (strcmp (drive->id->model, "V004E0DT") == 0 ||
strcmp (drive->id->model, "0V400ETD") == 0)
CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
else if ( strcmp (drive->id->model, "CD-ROM CDU55D") == 0) /*sony cdu55d */
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
else if ( strcmp (drive->id->model, "CD-ROM CDU55D") == 0) /*sony cdu55d */
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
else if (strcmp (drive->id->model, "CD-ROM CDU55E") == 0)
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
else if (strcmp (drive->id->model, "CD-ROM CDU55E") == 0)
CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
} /* drive-id != NULL */
#endif /* not STANDARD_ATAPI */
drive->cdrom_info.toc = NULL;
......
This diff is collapsed.
/*
* linux/drivers/block/ide-tape.h Version 1.2 - ALPHA Jan 1, 1996
* linux/drivers/block/ide-tape.h Version 1.3 - ALPHA Feb 9, 1996
*
* Copyright (C) 1995, 1996 Gadi Oxman <tgud@tochnapc2.technion.ac.il>
*/
......@@ -96,6 +96,20 @@
#define IDETAPE_ALLOCATION_BLOCK 512
#endif
/*
* ide-tape currently uses two continous buffers, each of the size of
* one stage. By default, those buffers are allocated at initialization
* time and never released, since dynamic allocation of pages bigger
* than PAGE_SIZE may fail as memory becomes fragmented.
*
* This results in about 100 KB memory usage when the tape is idle.
* Setting IDETAPE_MINIMIZE_IDLE_MEMORY_USAGE to 1 will let ide-tape
* to dynamically allocate those buffers, resulting in about 20 KB idle
* memory usage.
*/
#define IDETAPE_MINIMIZE_IDLE_MEMORY_USAGE 0
/*
* The following are used to debug the driver:
*
......@@ -124,7 +138,7 @@
* Setting IDETAPE_MAX_PC_RETRIES to 0 will disable retries.
*/
#define IDETAPE_MAX_PC_RETRIES 2
#define IDETAPE_MAX_PC_RETRIES 3
/*
* With each packet command, we allocate a buffer of
......@@ -256,6 +270,9 @@ typedef struct idetape_packet_command_s {
byte error; /* Error code */
byte abort; /* Set when an error is considered normal - We won't retry */
byte wait_for_dsc; /* 1 When polling for DSC on a media access command */
byte dma_recommended; /* 1 when we prefer to use DMA if possible */
byte dma_in_progress; /* 1 while DMA in progress */
byte dma_error; /* 1 when encountered problem during DMA */
unsigned long request_transfer; /* Bytes to transfer */
unsigned long actually_transferred; /* Bytes actually transferred */
unsigned long buffer_size; /* Size of our data buffer */
......@@ -419,6 +436,14 @@ typedef struct {
byte last_status; /* Contents of the tape status register */
/* before the current request (saved for us */
/* by ide.c) */
/*
* After an ATAPI software reset, the status register will be
* locked, and thus we need to ignore it when checking DSC for
* the first time.
*/
byte reset_issued;
/* Position information */
byte partition_num; /* Currently not used */
......@@ -456,8 +481,11 @@ typedef struct {
struct request *active_data_request; /* Pointer to the request which is waiting in the device request queue */
char *data_buffer; /* The correspoding data buffer (for read/write requests) */
int data_buffer_size; /* Data buffer size (chosen based on the tape's recommendation */
char *temp_data_buffer; /* Temporary buffer for user <-> kernel space data transfer */
char *merge_buffer; /* Temporary buffer for user <-> kernel space data transfer */
int merge_buffer_offset;
int merge_buffer_size;
/*
* Pipeline parameters.
*
......
/*
* linux/drivers/block/ide.c Version 5.27 Feb 8, 1996
* linux/drivers/block/ide.c Version 5.28 Feb 11, 1996
*
* Copyright (C) 1994-1996 Linus Torvalds & authors (see below)
*/
......@@ -200,6 +200,11 @@
* add ali14xx support in ali14xx.c
* Version 5.27 add [no]autotune parameters to help cmd640
* move rz1000 support to rz1000.c
* Version 5.28 #include "ide_modes.h"
* fix disallow_unmask: now per-interface "no_unmask" bit
* force io_32bit to be the same on drive pairs of dtc2278
* improved IDE tape error handling, and tape DMA support
* bugfix in ide_do_drive_cmd() for cdroms + serialize
*
* Some additional driver compile-time options are in ide.h
*
......@@ -237,13 +242,13 @@
#endif /* CONFIG_PCI */
#include "ide.h"
#include "ide_modes.h"
static ide_hwgroup_t *irq_to_hwgroup [16];
static ide_hwgroup_t *irq_to_hwgroup [NR_IRQS];
static const byte ide_hwif_to_major[MAX_HWIFS] = {IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR};
static const unsigned short default_io_base[MAX_HWIFS] = {0x1f0, 0x170, 0x1e8, 0x168};
static const byte default_irqs[MAX_HWIFS] = {14, 15, 11, 10};
int ide_disallow_unmask = 0; /* for buggy hardware */
#if (DISK_RECOVERY_TIME > 0)
/*
......@@ -302,7 +307,7 @@ static void init_ide_data (void)
return; /* already initialized */
magic_cookie = 0;
for (h = 0; h < 16; ++h)
for (h = 0; h < NR_IRQS; ++h)
irq_to_hwgroup[h] = NULL;
/* bulk initialize hwif & drive info with zeros */
......@@ -311,10 +316,10 @@ static void init_ide_data (void)
*--p = 0;
} while (p > (byte *) ide_hwifs);
/* fill in any non-zero initial values */
for (h = 0; h < MAX_HWIFS; ++h) {
ide_hwif_t *hwif = &ide_hwifs[h];
/* fill in any non-zero initial values */
hwif->index = h;
hwif->noprobe = (h > 1);
hwif->io_base = default_io_base[h];
......@@ -334,7 +339,6 @@ static void init_ide_data (void)
for (unit = 0; unit < MAX_DRIVES; ++unit) {
ide_drive_t *drive = &hwif->drives[unit];
/* fill in any non-zero initial values */
drive->select.all = (unit<<4)|0xa0;
drive->hwif = hwif;
drive->ctl = 0x08;
......@@ -349,7 +353,7 @@ static void init_ide_data (void)
}
}
#define VLB_SYNC 1
#if SUPPORT_VLB_SYNC
/*
* Some localbus EIDE interfaces require a special access sequence
* when using 32-bit I/O instructions to transfer data. We call this
......@@ -362,6 +366,7 @@ static inline void do_vlb_sync (unsigned short port) {
(void) inb (port);
(void) inb (port);
}
#endif /* SUPPORT_VLB_SYNC */
/*
* This is used for most PIO data transfers *from* the IDE interface
......@@ -373,7 +378,7 @@ void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
byte io_32bit = drive->io_32bit;
if (io_32bit) {
#ifdef VLB_SYNC
#if SUPPORT_VLB_SYNC
if (io_32bit & 2) {
cli();
do_vlb_sync(io_base+IDE_NSECTOR_OFFSET);
......@@ -381,7 +386,7 @@ void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
if (drive->unmask)
sti();
} else
#endif /* VLB_SYNC */
#endif /* SUPPORT_VLB_SYNC */
insl(data_reg, buffer, wcount);
} else
insw(data_reg, buffer, wcount<<1);
......@@ -397,7 +402,7 @@ void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
byte io_32bit = drive->io_32bit;
if (io_32bit) {
#ifdef VLB_SYNC
#if SUPPORT_VLB_SYNC
if (io_32bit & 2) {
cli();
do_vlb_sync(io_base+IDE_NSECTOR_OFFSET);
......@@ -405,7 +410,7 @@ void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
if (drive->unmask)
sti();
} else
#endif /* VLB_SYNC */
#endif /* SUPPORT_VLB_SYNC */
outsl(data_reg, buffer, wcount);
} else
outsw(data_reg, buffer, wcount<<1);
......@@ -723,6 +728,10 @@ static void do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
void ide_do_reset (ide_drive_t *drive)
{
do_reset1 (drive, 0);
#ifdef CONFIG_BLK_DEV_IDETAPE
if (drive->media == ide_tape)
drive->tape.reset_issued=1;
#endif /* CONFIG_BLK_DEV_IDETAPE */
}
/*
......@@ -851,7 +860,8 @@ void ide_error (ide_drive_t *drive, const char *msg, byte stat)
if ((rq = HWGROUP(drive)->rq) == NULL || drive == NULL)
return;
/* retry only "normal" I/O: */
if (rq->cmd != READ && rq->cmd != WRITE && drive->media != ide_cdrom) {
if (rq->cmd == IDE_DRIVE_CMD || (rq->cmd != READ && rq->cmd != WRITE && drive->media == ide_disk))
{
rq->errors = 1;
ide_end_drive_cmd(drive, stat, err);
return;
......@@ -872,8 +882,16 @@ void ide_error (ide_drive_t *drive, const char *msg, byte stat)
if (GET_STAT() & (BUSY_STAT|DRQ_STAT))
rq->errors |= ERROR_RESET; /* Mmmm.. timing problem */
if (rq->errors >= ERROR_MAX)
ide_end_request(0, HWGROUP(drive));
if (rq->errors >= ERROR_MAX) {
#ifdef CONFIG_BLK_DEV_IDETAPE
if (drive->media == ide_tape) {
rq->errors = 0;
idetape_end_request(0, HWGROUP(drive));
}
else
#endif /* CONFIG_BLK_DEV_IDETAPE */
ide_end_request(0, HWGROUP(drive));
}
else {
if ((rq->errors & ERROR_RESET) == ERROR_RESET) {
++rq->errors;
......@@ -1347,6 +1365,12 @@ static inline void do_request (ide_hwif_t *hwif, struct request *rq)
#endif /* CONFIG_BLK_DEV_IDECD */
#ifdef CONFIG_BLK_DEV_IDETAPE
case ide_tape:
if (rq->cmd == IDE_DRIVE_CMD) {
byte *args = (byte *) rq->buffer;
OUT_BYTE(args[2],IDE_FEATURE_REG);
ide_cmd(drive, args[0], args[1], &drive_cmd_intr);
return;
}
idetape_do_request (drive, rq, block);
return;
#endif /* CONFIG_BLK_DEV_IDETAPE */
......@@ -1656,9 +1680,13 @@ int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t actio
if (cur_rq == NULL || action == ide_preempt) {
rq->next = cur_rq;
bdev->current_request = rq;
HWGROUP(drive)->rq = NULL;
if (action != ide_preempt)
if (action == ide_preempt) {
HWGROUP(drive)->rq = NULL;
} else
if (HWGROUP(drive)->rq == NULL) { /* is this necessary (?) */
bdev->request_fn();
cli();
}
} else {
if (action == ide_wait || action == ide_end) {
while (cur_rq->next != NULL) /* find end of list */
......@@ -1667,7 +1695,7 @@ int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t actio
rq->next = cur_rq->next;
cur_rq->next = rq;
}
if (action == ide_wait)
if (action == ide_wait && rq->rq_status != RQ_INACTIVE)
down(&sem); /* wait for it to be serviced */
restore_flags(flags);
return rq->errors ? -EIO : 0; /* return -EIO if errors */
......@@ -1879,8 +1907,10 @@ static int ide_ioctl (struct inode *inode, struct file *file,
return write_fs_long(arg, drive->bad_wstat == BAD_R_STAT);
case HDIO_SET_DMA:
if (drive->media != ide_disk)
#ifdef CONFIG_BLK_DEV_IDECD
if (drive->media == ide_cdrom)
return -EPERM;
#endif /* CONFIG_BLK_DEV_IDECD */
if (!drive->id || !(drive->id->capability & 1) || !HWIF(drive)->dmaproc)
return -EPERM;
case HDIO_SET_KEEPSETTINGS:
......@@ -1907,7 +1937,7 @@ static int ide_ioctl (struct inode *inode, struct file *file,
drive->keep_settings = arg;
break;
case HDIO_SET_UNMASKINTR:
if (arg && ide_disallow_unmask) {
if (arg && HWIF(drive)->no_unmask) {
restore_flags(flags);
return -EPERM;
}
......@@ -1917,11 +1947,13 @@ static int ide_ioctl (struct inode *inode, struct file *file,
drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
break;
case HDIO_SET_32BIT:
if (arg > (1 + (SUPPORT_VLB_SYNC<<1)))
return -EINVAL;
drive->io_32bit = arg;
#ifndef VLB_SYNC
if (arg & 2)
printk("%s: VLB_SYNC not supported by this kernel\n", drive->name);
#endif
#ifdef CONFIG_BLK_DEV_DTC2278
if (HWIF(drive)->chipset == ide_dtc2278)
HWIF(drive)->drives[!drive->select.b.unit].io_32bit = arg;
#endif /* CONFIG_BLK_DEV_DTC2278 */
break;
}
restore_flags(flags);
......@@ -1932,7 +1964,7 @@ static int ide_ioctl (struct inode *inode, struct file *file,
return -EACCES;
if (MINOR(inode->i_rdev) & PARTN_MASK)
return -EINVAL;
if ((drive->id != NULL) && (arg > drive->id->max_multsect))
if (drive->id && arg > drive->id->max_multsect)
return -EINVAL;
save_flags(flags);
cli();
......@@ -2093,15 +2125,19 @@ static inline void do_identify (ide_drive_t *drive, byte cmd)
#endif /* CONFIG_BLK_DEV_IDECD */
case 1:
#ifdef CONFIG_BLK_DEV_IDETAPE
printk ("TAPE drive\n");
printk ("TAPE drive");
if (idetape_identify_device (drive,id)) {
drive->media = ide_tape;
drive->present = 1;
drive->removeable = 1;
if (HWIF(drive)->dmaproc != NULL &&
!HWIF(drive)->dmaproc(ide_dma_check, drive))
printk(", DMA");
printk("\n");
}
else {
drive->present = 0;
printk ("ide-tape: The tape is not supported by this version of the driver\n");
printk ("\nide-tape: the tape is not supported by this version of the driver\n");
}
return;
#else
......@@ -2249,7 +2285,7 @@ static int try_to_identify (ide_drive_t *drive, byte cmd)
if (OK_STAT(GET_STAT(),DRQ_STAT,BAD_R_STAT)) {
cli(); /* some systems need this */
do_identify(drive, cmd); /* drive returned ID */
if (drive->present && (drive->media == ide_disk || drive->media == ide_cdrom)) {
if (drive->present && drive->media != ide_tape) {
ide_tuneproc_t *tuneproc = HWIF(drive)->tuneproc;
if (tuneproc != NULL && drive->autotune == 1)
tuneproc(drive, 255); /* auto-tune PIO mode */
......
......@@ -25,6 +25,9 @@
#undef REALLY_FAST_IO /* define if ide ports are perfect */
#define INITIAL_MULT_COUNT 0 /* off=0; on=2,4,8,16,32, etc.. */
#ifndef SUPPORT_VLB_SYNC /* 1 to support weird 32-bit chips */
#define SUPPORT_VLB_SYNC 1 /* 0 to reduce kernel size */
#endif
#ifndef DISK_RECOVERY_TIME /* off=0; on=access_delay_time */
#define DISK_RECOVERY_TIME 0 /* for hardware that needs it */
#endif
......@@ -347,7 +350,12 @@ typedef struct ide_drive_s {
* Returns 1 if DMA read/write could not be started, in which case the caller
* should either try again later, or revert to PIO for the current request.
*/
typedef enum {ide_dma_read = 0, ide_dma_write = 1, ide_dma_abort = 2, ide_dma_check = 3} ide_dma_action_t;
typedef enum { ide_dma_read = 0, ide_dma_write = 1,
ide_dma_abort = 2, ide_dma_check = 3,
ide_dma_status_bad = 4, ide_dma_transferred = 5,
ide_dma_begin = 6 }
ide_dma_action_t;
typedef int (ide_dmaproc_t)(ide_dma_action_t, ide_drive_t *);
......@@ -401,6 +409,7 @@ typedef struct hwif_s {
unsigned noprobe : 1; /* don't probe for this interface */
unsigned present : 1; /* this interface exists */
unsigned serialized : 1; /* valid only for ide_hwifs[0] */
unsigned no_unmask : 1; /* disallow setting unmask bits */
#if (DISK_RECOVERY_TIME > 0)
unsigned long last_time; /* time when previous rq was done */
#endif
......@@ -616,6 +625,13 @@ void idetape_setup (ide_drive_t *drive);
void idetape_do_request (ide_drive_t *drive, struct request *rq, unsigned long block);
/*
* idetape_end_request is used to finish servicing a request, and to
* insert a pending pipeline request into the main device queue.
*/
void idetape_end_request (byte uptodate, ide_hwgroup_t *hwgroup);
/*
* Block device interface functions.
*/
......
#ifndef _IDE_MODES_H
#define _IDE_MODES_H
/*
* linux/drivers/block/ide_modes.h
*
* Copyright (C) 1996 Linus Torvalds, Igor Abramov, and Mark Lord
*/
/*
* Shared data/functions for determining best PIO mode for an IDE drive.
* Most of this stuff originally lived in cmd640.c, and changes to the
* ide_pio_blacklist[] table should be made with EXTREME CAUTION to avoid
* breaking the fragile cmd640.c support.
*/
#if defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS)
#ifndef _IDE_C
int ide_scan_pio_blacklist (char *model);
unsigned int ide_get_best_pio_mode (ide_drive_t *drive);
#else /* _IDE_C */
/*
* Black list. Some drives incorrectly report their maximal PIO mode,
* at least in respect to CMD640. Here we keep info on some known drives.
*/
static struct ide_pio_info {
const char *name;
int pio;
} ide_pio_blacklist [] = {
/* { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
{ "WDC AC2700", 3 },
{ "WDC AC2540", 3 },
{ "WDC AC2420", 3 },
{ "WDC AC2340", 3 },
{ "WDC AC2250", 0 },
{ "WDC AC2200", 0 },
{ "WDC AC2120", 0 },
{ "WDC AC2850", 3 },
{ "WDC AC1270", 3 },
{ "WDC AC1170", 3 },
{ "WDC AC1210", 1 },
{ "WDC AC280", 0 },
/* { "WDC AC21000", 4 }, */
{ "WDC AC31000", 3 },
/* { "WDC AC21200", 4 }, */
{ "WDC AC31200", 3 },
/* { "WDC AC31600", 4 }, */
{ "Maxtor 7131 AT", 1 },
{ "Maxtor 7171 AT", 1 },
{ "Maxtor 7213 AT", 1 },
{ "Maxtor 7245 AT", 1 },
{ "Maxtor 7345 AT", 1 },
{ "Maxtor 7546 AT", 3 },
{ "Maxtor 7540 AV", 3 },
{ "SAMSUNG SHD-3121A", 1 },
{ "SAMSUNG SHD-3122A", 1 },
{ "SAMSUNG SHD-3172A", 1 },
/* { "ST51080A", 4 },
* { "ST51270A", 4 },
* { "ST31220A", 4 },
* { "ST31640A", 4 },
* { "ST32140A", 4 },
* { "ST3780A", 4 },
*/
{ "ST5660A", 3 },
{ "ST3660A", 3 },
{ "ST3630A", 3 },
{ "ST3655A", 3 },
{ "ST3391A", 3 },
{ "ST3390A", 1 },
{ "ST3600A", 1 },
{ "ST3290A", 0 },
{ "ST3144A", 0 },
{ "QUANTUM ELS127A", 0 },
{ "QUANTUM ELS170A", 0 },
{ "QUANTUM LPS240A", 0 },
{ "QUANTUM LPS210A", 3 },
{ "QUANTUM LPS270A", 3 },
{ "QUANTUM LPS365A", 3 },
{ "QUANTUM LPS540A", 3 },
{ "QUANTUM FIREBALL", 3 }, /* For models 540/640/1080/1280 */
/* 1080A works fine in mode4 with triton */
{ NULL, 0 }
};
/*
* This routine searches the ide_pio_blacklist for an entry
* matching the start/whole of the supplied model name.
*
* Returns -1 if no match found.
* Otherwise returns the recommended PIO mode from ide_pio_blacklist[].
*/
int ide_scan_pio_blacklist (char *model)
{
struct ide_pio_info *p;
for (p = ide_pio_blacklist; p->name != NULL; p++) {
if (strncmp(p->name, model, strlen(p->name)) == 0)
return p->pio;
}
return -1;
}
/*
* This routine returns the recommended PIO mode for a given drive,
* based on the drive->id information and the ide_pio_blacklist[].
* This is used by most chipset support modules when "auto-tuning".
*/
unsigned int ide_get_best_pio_mode (ide_drive_t *drive)
{
unsigned int pio = 0;
struct hd_driveid *id = drive->id;
if (id != NULL) {
if (HWIF(drive)->chipset != ide_cmd640 && !strcmp("QUANTUM FIREBALL1080A", id->model))
pio = 4;
else
pio = ide_scan_pio_blacklist(id->model);
if (pio == -1) {
pio = (id->tPIO < 2) ? id->tPIO : 2;
if (id->field_valid & 2) {
byte modes = id->eide_pio_modes;
if (modes & 4) pio = 5;
else if (modes & 2) pio = 4;
else if (modes & 1) pio = 3;
}
}
}
return pio;
}
#endif /* _IDE_C */
#endif /* defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS) */
#endif /* _IDE_MODES_H */
......@@ -24,7 +24,12 @@
/*
* The request-struct contains all necessary data
* to load a nr of sectors into memory
*
* NR_REQUEST is the number of entries in the request-queue.
* NOTE that writes may use only the low 2/3 of these: reads
* take precedence.
*/
#define NR_REQUEST 16
static struct request all_requests[NR_REQUEST];
/*
......@@ -37,34 +42,10 @@ struct wait_queue * wait_for_request = NULL;
int read_ahead[MAX_BLKDEV] = {0, };
/* blk_dev_struct is:
* do_request-address
* next-request
* *request_fn
* *current_request
*/
struct blk_dev_struct blk_dev[MAX_BLKDEV] = {
{ NULL, NULL }, /* 0 no_dev */
{ NULL, NULL }, /* 1 dev mem */
{ NULL, NULL }, /* 2 dev fd */
{ NULL, NULL }, /* 3 dev ide0 or hd */
{ NULL, NULL }, /* 4 dev ttyx */
{ NULL, NULL }, /* 5 dev tty */
{ NULL, NULL }, /* 6 dev lp */
{ NULL, NULL }, /* 7 dev pipes */
{ NULL, NULL }, /* 8 dev sd */
{ NULL, NULL }, /* 9 dev st */
{ NULL, NULL }, /* 10 */
{ NULL, NULL }, /* 11 */
{ NULL, NULL }, /* 12 */
{ NULL, NULL }, /* 13 */
{ NULL, NULL }, /* 14 */
{ NULL, NULL }, /* 15 */
{ NULL, NULL }, /* 16 */
{ NULL, NULL }, /* 17 */
{ NULL, NULL }, /* 18 */
{ NULL, NULL }, /* 19 */
{ NULL, NULL }, /* 20 */
{ NULL, NULL }, /* 21 */
{ NULL, NULL } /* 22 dev ide1 */
};
struct blk_dev_struct blk_dev[MAX_BLKDEV]; /* initialized by blk_dev_init() */
/*
* blk_size contains the size of all block-devices in units of 1024 byte
......@@ -610,6 +591,12 @@ void ll_rw_swap_file(int rw, kdev_t dev, unsigned int *b, int nb, char *buf)
int blk_dev_init(void)
{
struct request * req;
struct blk_dev_struct *dev;
for (dev = blk_dev + MAX_BLKDEV; dev-- != blk_dev;) {
dev->request_fn = NULL;
dev->current_request = NULL;
}
req = all_requests + NR_REQUEST;
while (--req >= all_requests) {
......@@ -634,6 +621,9 @@ int blk_dev_init(void)
#else
outb_p(0xc, 0x3f2);
#endif
#ifdef CONFIG_CDI_INIT
cdi_init();
#endif CONFIG_CDI_INIT
#ifdef CONFIG_CDU31A
cdu31a_init();
#endif CONFIG_CDU31A
......
/*
* linux/drivers/block/qd6580.c Version 0.01 Feb 06, 1996
* linux/drivers/block/qd6580.c Version 0.02 Feb 09, 1996
*
* Copyright (C) 1996 Linus Torvalds & author (see below)
*/
......@@ -21,6 +21,7 @@
#include <linux/hdreg.h>
#include <asm/io.h>
#include "ide.h"
#include "ide_modes.h"
/*
* Register 0xb3 looks like:
......@@ -43,19 +44,16 @@ static void tune_qd6580 (ide_drive_t *drive, byte pio)
{
unsigned long flags;
if (pio == 255) { /* auto-tune */
struct hd_driveid *id = drive->id;
pio = id->tPIO;
if ((id->field_valid & 0x02) && (id->eide_pio_modes & 0x03))
pio = 3;
}
pio++; /* is this correct? */
if (pio == 255)
pio = ide_get_best_pio_mode (drive);
if (pio > 3)
pio = 3;
save_flags(flags);
cli();
outb_p(0x8d,0xb0);
outb_p(0x0 ,0xb2);
outb_p((pio<<4)|0x0f,0xb3);
outb_p(((pio+1)<<4)|0x0f,0xb3);
inb(0x3f6);
restore_flags(flags);
}
......
......@@ -45,8 +45,8 @@ void init_rz1000 (byte bus, byte fn)
if ((rc = pcibios_read_config_word(bus, fn, 0x40, &reg))
|| (rc = pcibios_write_config_word(bus, fn, 0x40, reg & 0xdfff)))
{
extern int ide_disallow_unmask;
ide_disallow_unmask = 1;
ide_hwifs[0].no_unmask = 1;
ide_hwifs[1].no_unmask = 1;
ide_hwifs[0].serialized = 1;
ide_pci_access_error (rc);
printk("serialized, disabled unmasking\n");
......
......@@ -95,6 +95,7 @@
*
* And, yes, Intel Zappa boards really *do* use the Triton IDE ports.
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/timer.h>
......@@ -116,7 +117,8 @@
* of drives which do not support mword2 DMA but which are
* known to work fine with this interface under Linux.
*/
const char *good_dma_drives[] = {"Micropolis 2112A"};
const char *good_dma_drives[] = {"Micropolis 2112A",
"CONNER CTMA 4000"};
/*
* Our Physical Region Descriptor (PRD) table should be large enough
......@@ -184,8 +186,13 @@ static int build_dmatable (ide_drive_t *drive)
* is always composed of two adjacent physical 4kB pages rather
* than two possibly non-adjacent physical 4kB pages.
*/
if (bh == NULL) { /* paging requests have (rq->bh == NULL) */
if (bh == NULL) { /* paging and tape requests have (rq->bh == NULL) */
addr = virt_to_bus (rq->buffer);
#ifdef CONFIG_BLK_DEV_IDETAPE
if (drive->media == ide_tape)
size = drive->tape.pc->request_transfer;
else
#endif /* CONFIG_BLK_DEV_IDETAPE */
size = rq->nr_sectors << 9;
} else {
/* group sequential buffers into one large buffer */
......@@ -255,6 +262,10 @@ static int config_drive_for_dma (ide_drive_t *drive)
* sector address using CHS or LBA. All that remains is to prepare for DMA
* and then issue the actual read/write DMA/PIO command to the drive.
*
* For ATAPI devices, we just prepare for DMA and return. The caller should
* then issue the packet command to the drive and call us again with
* ide_dma_begin afterwards.
*
* Returns 0 if all went well.
* Returns 1 if DMA read/write could not be started, in which case
* the caller should revert to PIO for the current request.
......@@ -274,6 +285,17 @@ static int triton_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
reading = 0;
case ide_dma_read:
break;
case ide_dma_status_bad:
return ((inb(dma_base+2) & 7) != 4); /* verify good DMA status */
case ide_dma_transferred:
#if 0
return (number of bytes actually transferred);
#else
return (0);
#endif
case ide_dma_begin:
outb(inb(dma_base)|1, dma_base); /* begin DMA */
return 0;
default:
printk("triton_dmaproc: unsupported func: %d\n", func);
return 1;
......@@ -283,6 +305,10 @@ static int triton_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
outl(virt_to_bus (HWIF(drive)->dmatable), dma_base + 4); /* PRD table */
outb(reading, dma_base); /* specify r/w */
outb(0x26, dma_base+2); /* clear status bits */
#ifdef CONFIG_BLK_DEV_IDEATAPI
if (drive->media != ide_disk)
return 0;
#endif /* CONFIG_BLK_DEV_IDEATAPI */
ide_set_handler(drive, &dma_intr, WAIT_CMD); /* issue cmd to drive */
OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG);
outb(inb(dma_base)|1, dma_base); /* begin DMA */
......
/*
* linux/drivers/block/umc8672.c Version 0.02 Feb 06, 1996
* linux/drivers/block/umc8672.c Version 0.03 Feb 09, 1996
*
* Copyright (C) 1995-1996 Linus Torvalds & author (see below)
*/
......@@ -15,6 +15,7 @@
* This will get cleaned up in a subsequent release.
*
* Version 0.02 now configs/compiles separate from ide.c -ml
* Version 0.03 enhanced auto-tune, fix display bug
*/
/*
......@@ -46,10 +47,10 @@
#include <linux/hdreg.h>
#include <asm/io.h>
#include "ide.h"
#include "ide_modes.h"
/*
* The speeds will eventually become selectable using hdparm via ioctl's,
* but for now they are coded here:
* Default speeds. These can be changed with "auto-tune" and/or hdparm.
*/
#define UMC_DRIVE0 1 /* DOS measured drive speeds */
#define UMC_DRIVE1 1 /* 0 to 11 allowed */
......@@ -57,7 +58,7 @@
#define UMC_DRIVE3 1 /* In case of crash reduce speed */
static byte current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3};
static const byte pio_to_umc [5] = {0,3,6,10,11}; /* rough guesses */
static const byte pio_to_umc [5] = {0,3,7,10,11}; /* rough guesses */
/* 0 1 2 3 4 5 6 7 8 9 10 11 */
static const byte speedtab [3][12] = {
......@@ -103,23 +104,16 @@ static void umc_set_speeds (byte speeds[])
restore_flags(flags);
printk ("umc8672: drive speeds [0 to 11]: %d %d %d %d\n",
speeds[0], speeds[1], speeds[2], speeds[4]);
speeds[0], speeds[1], speeds[2], speeds[3]);
}
static void tune_umc (ide_drive_t *drive, byte pio)
{
if (pio == 255) { /* auto-tune */
struct hd_driveid *id = drive->id;
pio = id->tPIO;
if (id->field_valid & 0x02) {
if (id->eide_pio_modes & 0x01)
pio = 3;
if (id->eide_pio_modes & 0x02)
pio = 4;
}
}
if (pio == 255)
pio = ide_get_best_pio_mode(drive);
if (pio > 4)
pio = 4;
current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio];
umc_set_speeds (current_speeds);
}
......
......@@ -19,4 +19,8 @@ tristate 'Sony CDU535 CDROM support' CONFIG_CDU535
tristate 'Goldstar R420 CDROM support' CONFIG_GSCD
tristate 'Philips/LMS CM206 CDROM support' CONFIG_CM206
tristate 'Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD
tristate 'Sanyo H94A CDROM support' CONFIG_SJCD
tristate 'Sanyo CDR-H94A CDROM support' CONFIG_SJCD
bool 'Soft configurable cdrom interface card support' CONFIG_CDI_INIT
if [ "$CONFIG_CDI_INIT" = "y" ]; then
tristate 'ISP16/MAD16/Mozart soft configurable cdrom interface support' CONFIG_ISP16_CDI
fi
......@@ -106,10 +106,24 @@ endif #CONFIG_OPTCD
ifeq ($(CONFIG_SJCD),y)
L_OBJS += sjcd.o
#else
# ifeq ($(CONFIG_SJCD),m)
# M_OBJS += sjcd.o
# endif
else
ifeq ($(CONFIG_SJCD),m)
M_OBJS += sjcd.o
endif
endif #CONFIG_SJCD
ifeq ($(CONFIG_CDI_INIT),y)
L_OBJS += cdi.o
endif #CONFIG_CDI_INIT
ifeq ($(CONFIG_ISP16_CDI),y)
L_OBJS += isp16.o
else
# ifeq ($(CONFIG_CDI_INIT),m)
# M_OBJS += cdi.o
# endif
ifeq ($(CONFIG_ISP16_CDI),m)
M_OBJS += isp16.o
endif
endif #CONFIG_ISP16_CDI
include $(TOPDIR)/Rules.make
/* -- cdi.c
*
* Initialisation of software configurable cdrom interface
* cards goes here.
*
* Copyright (c) 1996 Eric van der Maarel <H.T.M.v.d.Maarel@marin.nl>
*
* Version 0.1
*
* History:
* 0.1 First release. Only support for ISP16/MAD16/Mozart.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <linux/config.h>
#include <linux/blk.h> /* where the proto type of cdi_init() is */
#ifdef CONFIG_ISP16_CDI
#include <linux/isp16.h>
#endif CONFIG_ISP16_CDI
/*
* Cdrom interface configuration.
*/
int
cdi_init(void)
{
int ret_val = -1;
#ifdef CONFIG_ISP16_CDI
ret_val &= isp16_init();
#endif CONFIG_ISP16_CDI
return(ret_val);
}
/* -- ISP16 cdrom detection and configuration
*
* Copyright (c) 1995,1996 Eric van der Maarel <H.T.M.v.d.Maarel@marin.nl>
*
* Version 0.6
*
* History:
* 0.5 First release.
* Was included in the sjcd and optcd cdrom drivers.
* 0.6 First "stand-alone" version.
* Removed sound configuration.
* Added "module" support.
*
* Detect cdrom interface on ISP16 sound card.
* Configure cdrom interface.
*
* Algorithm for the card with OPTi 82C928 taken
* from the CDSETUP.SYS driver for MSDOS,
* by OPTi Computers, version 2.03.
* Algorithm for the card with OPTi 82C929 as communicated
* to me by Vadim Model and Leo Spiekman.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#define ISP16_VERSION_MAJOR 0
#define ISP16_VERSION_MINOR 6
#ifdef MODULE
#include <linux/module.h>
#endif /* MODULE */
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/ioport.h>
#include <linux/isp16.h>
#include <asm/io.h>
static short isp16_detect(void);
static short isp16_c928__detect(void);
static short isp16_c929__detect(void);
static short isp16_cdi_config(int base, u_char drive_type, int irq, int dma);
static short isp16_type; /* dependent on type of interface card */
static u_char isp16_ctrl;
static u_short isp16_enable_port;
static int isp16_cdrom_base = ISP16_CDROM_IO_BASE;
static int isp16_cdrom_irq = ISP16_CDROM_IRQ;
static int isp16_cdrom_dma = ISP16_CDROM_DMA;
static char *isp16_cdrom_type = ISP16_CDROM_TYPE;
#ifdef MODULE
int init_module(void);
void cleanup_module(void);
#endif
#define ISP16_IN(p) (outb(isp16_ctrl,ISP16_CTRL_PORT), inb(p))
#define ISP16_OUT(p,b) (outb(isp16_ctrl,ISP16_CTRL_PORT), outb(b,p))
void
isp16_setup(char *str, int *ints)
{
if ( ints[0] > 0 )
isp16_cdrom_base = ints[1];
if ( ints[0] > 1 )
isp16_cdrom_irq = ints[2];
if ( ints[0] > 2 )
isp16_cdrom_dma = ints[3];
if ( str )
isp16_cdrom_type = str;
}
/*
* ISP16 initialisation.
*
*/
int
isp16_init(void)
{
u_char expected_drive;
printk("ISP16: configuration cdrom interface, version %d.%d.\n", ISP16_VERSION_MAJOR,
ISP16_VERSION_MINOR);
if ( !strcmp(isp16_cdrom_type, "noisp16") ) {
printk("ISP16: no cdrom interface configured.\n");
return(0);
}
if (check_region(ISP16_IO_BASE, ISP16_IO_SIZE)) {
printk("ISP16: i/o ports already in use.\n");
return(-EIO);
}
if ( (isp16_type=isp16_detect()) < 0 ) {
printk("ISP16: no cdrom interface found.\n");
return(-EIO);
}
printk("ISP16: cdrom interface (with OPTi 82C92%d chip) detected.\n",
(isp16_type==2) ? 9 : 8);
if ( !strcmp(isp16_cdrom_type, "Sanyo") )
expected_drive = (isp16_type ? ISP16_SANYO1 : ISP16_SANYO0);
else if ( !strcmp(isp16_cdrom_type, "Sony") )
expected_drive = ISP16_SONY;
else if ( !strcmp(isp16_cdrom_type, "Panasonic") )
expected_drive = (isp16_type ? ISP16_PANASONIC1 : ISP16_PANASONIC0);
else if ( !strcmp(isp16_cdrom_type, "Mitsumi") )
expected_drive = ISP16_MITSUMI;
else {
printk("ISP16: %s not supported by cdrom interface.\n", isp16_cdrom_type);
return(-EIO);
}
if ( isp16_cdi_config(isp16_cdrom_base, expected_drive,
isp16_cdrom_irq, isp16_cdrom_dma ) < 0) {
printk("ISP16: cdrom interface has not been properly configured.\n");
return(-EIO);
}
printk("ISP16: cdrom interface set up with io base 0x%03X, irq %d, dma %d,"
" type %s.\n", isp16_cdrom_base, isp16_cdrom_irq, isp16_cdrom_dma,
isp16_cdrom_type);
return(0);
}
static short
isp16_detect(void)
{
if ( isp16_c929__detect() >= 0 )
return(2);
else
return(isp16_c928__detect());
}
static short
isp16_c928__detect(void)
{
u_char ctrl;
u_char enable_cdrom;
u_char io;
short i = -1;
isp16_ctrl = ISP16_C928__CTRL;
isp16_enable_port = ISP16_C928__ENABLE_PORT;
/* read' and write' are a special read and write, respectively */
/* read' ISP16_CTRL_PORT, clear last two bits and write' back the result */
ctrl = ISP16_IN( ISP16_CTRL_PORT ) & 0xFC;
ISP16_OUT( ISP16_CTRL_PORT, ctrl );
/* read' 3,4 and 5-bit from the cdrom enable port */
enable_cdrom = ISP16_IN( ISP16_C928__ENABLE_PORT ) & 0x38;
if ( !(enable_cdrom & 0x20) ) { /* 5-bit not set */
/* read' last 2 bits of ISP16_IO_SET_PORT */
io = ISP16_IN( ISP16_IO_SET_PORT ) & 0x03;
if ( ((io&0x01)<<1) == (io&0x02) ) { /* bits are the same */
if ( io == 0 ) { /* ...the same and 0 */
i = 0;
enable_cdrom |= 0x20;
}
else { /* ...the same and 1 */ /* my card, first time 'round */
i = 1;
enable_cdrom |= 0x28;
}
ISP16_OUT( ISP16_C928__ENABLE_PORT, enable_cdrom );
}
else { /* bits are not the same */
ISP16_OUT( ISP16_CTRL_PORT, ctrl );
return(i); /* -> not detected: possibly incorrect conclusion */
}
}
else if ( enable_cdrom == 0x20 )
i = 0;
else if ( enable_cdrom == 0x28 ) /* my card, already initialised */
i = 1;
ISP16_OUT( ISP16_CTRL_PORT, ctrl );
return(i);
}
static short
isp16_c929__detect(void)
{
u_char ctrl;
u_char tmp;
isp16_ctrl = ISP16_C929__CTRL;
isp16_enable_port = ISP16_C929__ENABLE_PORT;
/* read' and write' are a special read and write, respectively */
/* read' ISP16_CTRL_PORT and save */
ctrl = ISP16_IN( ISP16_CTRL_PORT );
/* write' zero to the ctrl port and get response */
ISP16_OUT( ISP16_CTRL_PORT, 0 );
tmp = ISP16_IN( ISP16_CTRL_PORT );
if ( tmp != 2 ) /* isp16 with 82C929 not detected */
return(-1);
/* restore ctrl port value */
ISP16_OUT( ISP16_CTRL_PORT, ctrl );
return(2);
}
static short
isp16_cdi_config(int base, u_char drive_type, int irq, int dma)
{
u_char base_code;
u_char irq_code;
u_char dma_code;
u_char i;
if ( (drive_type == ISP16_MITSUMI) && (dma != 0) )
printk("ISP16: Mitsumi cdrom drive has no dma support.\n");
switch (base) {
case 0x340: base_code = ISP16_BASE_340; break;
case 0x330: base_code = ISP16_BASE_330; break;
case 0x360: base_code = ISP16_BASE_360; break;
case 0x320: base_code = ISP16_BASE_320; break;
default:
printk("ISP16: base address 0x%03X not supported by cdrom interface.\n",
base);
return(-1);
}
switch (irq) {
case 0: irq_code = ISP16_IRQ_X; break; /* disable irq */
case 5: irq_code = ISP16_IRQ_5;
printk("ISP16: irq 5 shouldn't be used by cdrom interface,"
" due to possible conflicts with the sound card.\n");
break;
case 7: irq_code = ISP16_IRQ_7;
printk("ISP16: irq 7 shouldn't be used by cdrom interface,"
" due to possible conflicts with the sound card.\n");
break;
case 3: irq_code = ISP16_IRQ_3; break;
case 9: irq_code = ISP16_IRQ_9; break;
case 10: irq_code = ISP16_IRQ_10; break;
case 11: irq_code = ISP16_IRQ_11; break;
default:
printk("ISP16: irq %d not supported by cdrom interface.\n", irq );
return(-1);
}
switch (dma) {
case 0: dma_code = ISP16_DMA_X; break; /* disable dma */
case 1: printk("ISP16: dma 1 cannot be used by cdrom interface,"
" due to conflict with the sound card.\n");
return(-1); break;
case 3: dma_code = ISP16_DMA_3; break;
case 5: dma_code = ISP16_DMA_5; break;
case 6: dma_code = ISP16_DMA_6; break;
case 7: dma_code = ISP16_DMA_7; break;
default:
printk("ISP16: dma %d not supported by cdrom interface.\n", dma);
return(-1);
}
if ( drive_type != ISP16_SONY && drive_type != ISP16_PANASONIC0 &&
drive_type != ISP16_PANASONIC1 && drive_type != ISP16_SANYO0 &&
drive_type != ISP16_SANYO1 && drive_type != ISP16_MITSUMI &&
drive_type != ISP16_DRIVE_X ) {
printk("ISP16: drive type (code 0x%02X) not supported by cdrom"
" interface.\n", drive_type );
return(-1);
}
/* set type of interface */
i = ISP16_IN(ISP16_DRIVE_SET_PORT) & ISP16_DRIVE_SET_MASK; /* clear some bits */
ISP16_OUT( ISP16_DRIVE_SET_PORT, i|drive_type );
/* enable cdrom on interface with 82C929 chip */
if ( isp16_type > 1 )
ISP16_OUT( isp16_enable_port, ISP16_ENABLE_CDROM );
/* set base address, irq and dma */
i = ISP16_IN(ISP16_IO_SET_PORT) & ISP16_IO_SET_MASK; /* keep some bits */
ISP16_OUT( ISP16_IO_SET_PORT, i|base_code|irq_code|dma_code );
return(0);
}
#ifdef MODULE
int init_module(void)
{
return isp16_init();
}
void cleanup_module(void)
{
release_region(ISP16_IO_BASE, ISP16_IO_SIZE);
printk("ISP16: module released.\n");
}
#endif /* MODULE */
......@@ -5,9 +5,7 @@
Based on Aztech CD268 CDROM driver by Werner Zimmermann and preworks
by Eberhard Moenkeberg (emoenke@gwdg.de). ISP16 detection and
configuration by Eric van der Maarel (maarel@marin.nl) and
Vadim Model (vadim@cecmow.enet.dec.com).
by Eberhard Moenkeberg (emoenke@gwdg.de).
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -71,9 +69,6 @@
#include <linux/cdrom.h>
#include <linux/optcd.h>
#ifdef PROBE_ISP16
#include "optcd_isp16.h" /* optional ISP16 detection/configuration */
#endif
/* Debug support */
......@@ -1960,51 +1955,13 @@ static struct file_operations opt_fops = {
};
/* Flag indicates if ISP16 detection and initialisation should be skipped */
#define skip_isp16_init noisp16 /* Needed for the modutils. */
static int skip_isp16_init = 0;
/* Get kernel parameter when used as a kernel driver */
void optcd_setup(char *str, int *ints)
{
if (ints[0] > 0)
optcd_port = ints[1];
if (!strcmp(str ,"noisp16"))
skip_isp16_init = 1;
}
#ifdef PROBE_ISP16
/* If ISP16 I/O ports not already reserved, probe for an ISP16 interface card,
and enable SONY mode with no interrupts and no DMA.
(As far as I know, all Optics 8000 AT drives come with a SONY interface.
Interrupts and DMA are not supported).
Returns false only if ISP16 detected but couldn't be initialised. */
static int probe_isp16(void)
{
if (skip_isp16_init)
return 1;
if (check_region(ISP16_DRIVE_SET_PORT, 5))
return 1;
if (isp16_detect() < 0 ) {
printk( "No ISP16 cdrom interface found.\n" );
return 1;
}
isp16_sound_config(); /* Enable playing through speakers */
printk( "ISP16 cdrom interface detected.\n");
if (isp16_cdi_config(optcd_port, ISP16_SONY, 0, 0) < 0) {
printk( "ISP16 configure error.\n" );
return 0;
}
return 1;
}
#endif PROBE_ISP16
/* Test for presence of drive and initialize it. Called at boot time
or during module initialisation. */
int optcd_init(void)
......@@ -2021,11 +1978,6 @@ int optcd_init(void)
return -EIO;
}
#ifdef PROBE_ISP16
if (!probe_isp16())
return -EIO;
#endif
if (!reset_drive()) {
printk("optcd: drive at 0x%x not ready\n", optcd_port);
return -EIO;
......
This diff is collapsed.
......@@ -219,7 +219,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
case KIOCSOUND:
if (!perm)
return -EPERM;
kd_mksound(1193180 / (unsigned int) arg, 0);
if (arg)
arg = 1193180 / arg;
kd_mksound(arg, 0);
return 0;
case KDMKTONE:
......
......@@ -64,6 +64,11 @@
#define FEATUREMAP2 (WDC_SR_PSUOVER|WDC_SR_PSUUNDR)
#endif
#ifdef CONFIG_SOFT_WATCHDOG
#define FEATUREMAP1 0
#define FEATUREMAP2 0
#endif
#ifndef FEATUREMAP1
#error "Config option not set"
#endif
......@@ -14,11 +14,12 @@
Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
*/
static char *version = "3c59x.c:v0.11 1/21/96 becker@cesdis.gsfc.nasa.gov\n";
static char *version = "3c59x.c:v0.13 2/13/96 becker@cesdis.gsfc.nasa.gov\n";
/* "Knobs" that turn on special features. */
/* Use bus master transfers instead of programmed-I/O for the Tx process.
This is disabled by default! */
/* Allow the use of bus master transfers instead of programmed-I/O for the
Tx process. Bus master transfers are always disabled by default, but
iff this is set they may be turned on using 'options'. */
#define VORTEX_BUS_MASTER
/* Put out somewhat more debugging messages. (0 - no msg, 1 minimal msgs). */
......@@ -45,6 +46,11 @@ static char *version = "3c59x.c:v0.11 1/21/96 becker@cesdis.gsfc.nasa.gov\n";
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#ifdef HAVE_SHARED_IRQ
#define USE_SHARED_IRQ
#include <linux/shared_irq.h>
#endif
/* The total size is twice that of the original EtherLinkIII series: the
runtime register window, window 1, is now always mapped in. */
#define VORTEX_TOTAL_SIZE 0x20
......@@ -295,8 +301,8 @@ static int vortex_scan(struct device *dev)
int cards_found = 0;
if (pcibios_present()) {
int pci_index;
for (pci_index = 0; pci_index < 8; pci_index++) {
static int pci_index = 0;
for (; pci_index < 8; pci_index++) {
unsigned char pci_bus, pci_device_fn, pci_irq_line, pci_latency;
unsigned int pci_ioaddr;
unsigned short pci_command;
......@@ -340,8 +346,9 @@ static int vortex_scan(struct device *dev)
PCI_LATENCY_TIMER, 255);
}
#endif /* VORTEX_BUS_MASTER */
vortex_found_device(dev, pci_ioaddr, pci_irq_line,
index, options[cards_found]);
vortex_found_device(dev, pci_ioaddr, pci_irq_line, index,
dev && dev->mem_start ? dev->mem_start
: options[cards_found]);
dev = 0;
cards_found++;
}
......@@ -359,7 +366,8 @@ static int vortex_scan(struct device *dev)
&& (inw(ioaddr + 0xC82) & 0xFFF0) != 0x5920)
continue;
vortex_found_device(dev, ioaddr, inw(ioaddr + 0xC88) >> 12,
DEMON_INDEX, options[cards_found]);
DEMON_INDEX, dev && dev->mem_start
? dev->mem_start : options[cards_found]);
dev = 0;
cards_found++;
}
......@@ -389,7 +397,7 @@ static int vortex_found_device(struct device *dev, int ioaddr, int irq,
vp->product_name = product_names[product_index];
vp->options = options;
if (options >= 0) {
vp->media_override = options & 7;
vp->media_override = ((options & 7) == 2) ? 0 : options & 7;
vp->full_duplex = (options & 8) ? 1 : 0;
vp->bus_master = (options & 16) ? 1 : 0;
} else {
......@@ -414,7 +422,7 @@ static int vortex_found_device(struct device *dev, int ioaddr, int irq,
vp->product_name = product_names[product_index];
vp->options = options;
if (options >= 0) {
vp->media_override = options & 7;
vp->media_override = ((options & 7) == 2) ? 0 : options & 7;
vp->full_duplex = (options & 8) ? 1 : 0;
vp->bus_master = (options & 16) ? 1 : 0;
} else {
......@@ -534,12 +542,19 @@ vortex_open(struct device *dev)
outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
if (irq2dev_map[dev->irq] != NULL
|| (irq2dev_map[dev->irq] = dev) == NULL
|| dev->irq == 0
|| request_irq(dev->irq, &vortex_interrupt, 0, vp->product_name)) {
#ifdef USE_SHARED_IRQ
i = request_shared_irq(dev->irq, &vortex_interrupt, dev, vp->product_name);
if (i) /* Error */
return i;
#else
if (dev->irq == 0 || irq2dev_map[dev->irq] != NULL)
return -EAGAIN;
irq2dev_map[dev->irq] = dev;
if (request_irq(dev->irq, &vortex_interrupt, 0, vp->product_name)) {
irq2dev_map[dev->irq] = NULL;
return -EAGAIN;
}
#endif
if (vortex_debug > 1) {
EL3WINDOW(4);
......@@ -571,7 +586,7 @@ vortex_open(struct device *dev)
inw(ioaddr + 10);
inw(ioaddr + 12);
/* New: On the Vortex we must also clear the BadSSD counter. */
EL3WINDOW(3);
EL3WINDOW(4);
inb(ioaddr + 12);
/* Switch to register set 7 for normal use. */
......@@ -723,7 +738,11 @@ vortex_start_xmit(struct sk_buff *skb, struct device *dev)
after the Tx thread. */
static void vortex_interrupt(int irq, struct pt_regs *regs)
{
#ifdef USE_SHARED_IRQ
struct device *dev = (struct device *)(irq == 0 ? regs : irq2dev_map[irq]);
#else
struct device *dev = (struct device *)(irq2dev_map[irq]);
#endif
struct vortex_private *lp;
int ioaddr, status;
int latency;
......@@ -933,9 +952,13 @@ vortex_close(struct device *dev)
outw(inw(ioaddr + Wn4_Media) & ~Media_TP, ioaddr + Wn4_Media);
}
#ifdef USE_SHARED_IRQ
free_shared_irq(dev->irq, dev);
#else
free_irq(dev->irq);
/* Mmmm, we should diable all interrupt sources here. */
irq2dev_map[dev->irq] = 0;
#endif
update_stats(ioaddr, dev);
#ifdef MODULE
......@@ -979,7 +1002,7 @@ static void update_stats(int ioaddr, struct device *dev)
vp->stats.tx_window_errors += inb(ioaddr + 4);
vp->stats.rx_fifo_errors += inb(ioaddr + 5);
vp->stats.tx_packets += inb(ioaddr + 6);
vp->stats.tx_packets += (inb(ioaddr + 9)&15) << 8;
vp->stats.tx_packets += (inb(ioaddr + 9)&0x30) << 4;
/* Rx packets */ inb(ioaddr + 7); /* Must read to clear */
/* Tx deferrals */ inb(ioaddr + 8);
/* Don't bother with register 9, an extention of registers 6&7.
......@@ -988,7 +1011,7 @@ static void update_stats(int ioaddr, struct device *dev)
inw(ioaddr + 10); /* Total Rx and Tx octets. */
inw(ioaddr + 12);
/* New: On the Vortex we must also clear the BadSSD counter. */
EL3WINDOW(3);
EL3WINDOW(4);
inb(ioaddr + 12);
/* We change back to window 7 (not 1) with the Vortex. */
......
This diff is collapsed.
......@@ -76,6 +76,7 @@
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/if_slip.h>
#include "slip.h"
#ifdef CONFIG_INET
#include <linux/ip.h>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -76,10 +76,6 @@ ifdef CONFIG_SEQUENCER
OBJS := $(OBJS) sequencer.o
endif
ifdef CONFIG_PNP
OBJS := $(OBJS) sound_pnp.o
endif
ifdef CONFIG_SEQUENCER
OBJS := $(OBJS) sound_timer.o
endif
......
3.5-alpha8
3.5-beta2
0x030505
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#define SOUND_VERSION_STRING "3.5-alpha8-960109"
#define SOUND_VERSION_STRING "3.5-beta2-960210"
#define SOUND_INTERNAL_VERSION 0x030505
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment