Commit ccec108f authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.9

parent eaca2b6e
......@@ -614,9 +614,10 @@ S: New York, New York 10025
S: USA
N: Eric Youngdale
E: ericy@cais.com
E: eric@tantalus.nrl.navy.mil
D: General kernel hacker
D: SCSI iso9660 and ELF
D: SCSI, iso9660, ELF, ibcs2, clustering in buffer cache, generalized mmap.
S: 17 Canterbury Square #101
S: Alexandria, Virginia 22304
S: USA
......
VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 8
SUBLEVEL = 9
all: Version zImage
......
......@@ -5,7 +5,7 @@
* and for "no-sound" interfaces like Lasermate and the
* Panasonic CI-101P.
*
* NOTE: This is release 1.4.
* NOTE: This is release 1.5.
* It works with my SbPro & drive CR-521 V2.11 from 2/92
* and with the new CR-562-B V0.75 on a "naked" Panasonic
* CI-101P interface. And vice versa.
......@@ -72,6 +72,10 @@
* Added some debugging printout for the UPC/EAN code - but my drives
* return only zeroes. Is there no UPC/EAN code written?
*
* 1.5 Laborate with UPC/EAN code (not better yet).
* Adapt to kernel 1.1.8 change (have to explicitely include
* <linux/string.h> now).
*
* special thanks to Kai Makisara (kai.makisara@vtt.fi) for his fine
* elaborated speed-up experiments (and the fabulous results!), for
* the "push" towards load-free wait loops, and for the extensive mail
......@@ -113,6 +117,7 @@
#include <linux/cdrom.h>
#include <linux/ioport.h>
#include <linux/sbpcd.h>
#include <linux/string.h>
#if SBPCD_USE_IRQ
#include <linux/signal.h>
......@@ -129,7 +134,7 @@
#define MAJOR_NR MATSUSHITA_CDROM_MAJOR
#include "blk.h"
#define VERSION "1.4 Eberhard Moenkeberg <emoenke@gwdg.de>"
#define VERSION "1.5 Eberhard Moenkeberg <emoenke@gwdg.de>"
#define SBPCD_DEBUG
......@@ -149,6 +154,8 @@
#undef XA_TEST1
#define XA_TEST2
#define TEST_UPC 0
/*==========================================================================*/
/*==========================================================================*/
......@@ -238,6 +245,7 @@ static int sbp_data(void);
* (1<<DBG_UPC) show UPC info
* (1<<DBG_XA) XA mode debugging
* (1<<DBG_LCK) door (un)lock info
* (1<<DBG_SQ) dump SubQ frame
* (1<<DBG_000) unnecessary information
*/
#if 1
......@@ -249,6 +257,7 @@ static int sbpcd_debug = (1<<DBG_INF) |
(1<<DBG_IOC) |
(1<<DBG_XA) |
(1<<DBG_LCK) |
(1<<DBG_SQ) |
(1<<DBG_IOX);
#endif
static int sbpcd_ioaddr = CDROM_PORT; /* default I/O base address */
......@@ -287,7 +296,8 @@ static u_int flags_cmd_out;
static u_char cmd_type=0;
static u_char drvcmd[7];
static u_char infobuf[20];
static u_char scratch_buf[CD_XA_TAIL];
static u_char xa_head_buf[CD_XA_HEAD];
static u_char xa_tail_buf[CD_XA_TAIL];
static u_char timed_out=0;
static u_int datarate= 1000000;
......@@ -354,7 +364,6 @@ static struct {
u_char vol_ctrl3;
#endif 000
u_char SubQ_audio;
u_char SubQ_ctl_adr;
u_char SubQ_trk;
u_char SubQ_pnt_idx;
......@@ -1153,33 +1162,38 @@ static int xx_ReadSubQ(void)
int i,j;
DS[d].diskstate_flags &= ~subq_bit;
clr_cmdbuf();
if (new_drive)
{
drvcmd[0]=0x87;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
response_count=11;
}
else
{
drvcmd[0]=0x89;
drvcmd[1]=0x02;
flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
response_count=13;
}
for (j=0;j<255;j++)
for (j=255;j>0;j--)
{
clr_cmdbuf();
if (new_drive)
{
drvcmd[0]=0x87;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
response_count=11;
}
else
{
drvcmd[0]=0x89;
drvcmd[1]=0x02;
flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
response_count=13;
}
i=cmd_out();
if (i<0) return (i);
DPRINTF((DBG_SQ,"SBPCD: xx_ReadSubQ:"));
for (i=0;i<(new_drive?11:13);i++)
{
DPRINTF((DBG_SQ," %02X", infobuf[i]));
}
DPRINTF((DBG_SQ,"\n"));
if (infobuf[0]!=0) break;
if (!st_spinning)
if ((!st_spinning) || (j==1))
{
DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0;
DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0;
return (0);
}
}
DS[d].SubQ_audio=infobuf[0];
DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]);
DS[d].SubQ_trk=byt2bcd(infobuf[2]);
DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]);
......@@ -1479,37 +1493,62 @@ static int convert_UPC(u_char *p)
static int xx_ReadUPC(void)
{
int i;
#if TEST_UPC
int block, checksum;
#endif TEST_UPC
DS[d].diskstate_flags &= ~upc_bit;
clr_cmdbuf();
if (new_drive)
#if TEST_UPC
for (block=CD_BLOCK_OFFSET+1;block<CD_BLOCK_OFFSET+200;block++)
{
drvcmd[0]=0x88;
response_count=8;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
}
else
{
drvcmd[0]=0x08;
response_count=0;
flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
}
i=cmd_out();
if (i<0) return (i);
if (!new_drive)
{
response_count=16;
i=xx_ReadPacket();
#endif TEST_UPC
clr_cmdbuf();
if (new_drive)
{
drvcmd[0]=0x88;
#if TEST_UPC
drvcmd[1]=(block>>16)&0xFF;
drvcmd[2]=(block>>8)&0xFF;
drvcmd[3]=block&0xFF;
#endif TEST_UPC
response_count=8;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
}
else
{
drvcmd[0]=0x08;
#if TEST_UPC
drvcmd[2]=(block>>16)&0xFF;
drvcmd[3]=(block>>8)&0xFF;
drvcmd[4]=block&0xFF;
#endif TEST_UPC
response_count=0;
flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
}
i=cmd_out();
if (i<0) return (i);
if (!new_drive)
{
response_count=16;
i=xx_ReadPacket();
if (i<0) return (i);
}
#if TEST_UPC
checksum=0;
#endif TEST_UPC
DPRINTF((DBG_UPC,"SBPCD: UPC info: "));
for (i=0;i<(new_drive?8:16);i++)
{
#if TEST_UPC
checksum |= infobuf[i];
#endif TEST_UPC
DPRINTF((DBG_UPC,"%02X ", infobuf[i]));
}
DPRINTF((DBG_UPC,"\n"));
#if TEST_UPC
if ((checksum&0x7F)!=0) break;
}
DPRINTF((DBG_UPC,"SBPCD: UPC info: "));
for (i=0;i<(new_drive?8:16);i++)
{
DPRINTF((DBG_UPC,"%02X ", infobuf[i]));
}
DPRINTF((DBG_UPC,"\n"));
#endif TEST_UPC
DS[d].UPC_ctl_adr=0;
if (new_drive) i=0;
else i=2;
......@@ -1559,6 +1598,31 @@ static int yy_CheckMultiSession(void)
return (0);
}
/*==========================================================================*/
#if FUTURE
static int yy_SubChanInfo(int frame, int count, u_char *buffer)
/* "frame" is a RED BOOK address */
{
int i;
if (!new_drive) return (-3);
#if 0
if (DS[d].audio_state!=audio_playing) return (-2);
#endif
clr_cmdbuf();
drvcmd[0]=0x11;
drvcmd[1]=(frame>>16)&0xFF;
drvcmd[2]=(frame>>8)&0xFF;
drvcmd[3]=frame&0xFF;
drvcmd[5]=(count>>8)&0xFF;
drvcmd[6]=count&0xFF;
flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
cmd_type=READ_SC;
DS[d].frame_size=CD_FRAMESIZE_SUB;
i=cmd_out(); /* read directly into user's buffer */
return (i);
}
#endif FUTURE
/*==========================================================================*/
static void check_datarate(void)
{
#ifdef CDMKE
......@@ -2290,9 +2354,6 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file,
st=verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct cdrom_subchnl));
if (st) return (st);
memcpy_fromfs(&SC, (void *) arg, sizeof(struct cdrom_subchnl));
#if 0
if (DS[d].SubQ_audio==0x80) DS[d].SubQ_audio=CDROM_AUDIO_NO_STATUS;
#endif
switch (DS[d].audio_state)
{
case audio_playing:
......@@ -2634,7 +2695,7 @@ static int sbp_data(void)
u_int data_waits = 0;
u_int data_retrying = 0;
int error_flag;
int xa_count;
error_flag=0;
for (frame=DS[d].sbp_current;frame<DS[d].sbp_read_frames&&!error_flag; frame++)
......@@ -2687,12 +2748,18 @@ static int sbp_data(void)
p = DS[d].sbp_buf + frame * CD_FRAMESIZE;
if (sbpro_type) OUT(CDo_sel_d_i,0x01);
if (cmd_type==READ_M2) READ_DATA(CDi_data, scratch_buf, CD_XA_HEAD);
if (cmd_type==READ_M2) READ_DATA(CDi_data, xa_head_buf, CD_XA_HEAD);
READ_DATA(CDi_data, p, CD_FRAMESIZE);
if (cmd_type==READ_M2) READ_DATA(CDi_data, scratch_buf, CD_XA_TAIL);
if (cmd_type==READ_M2) READ_DATA(CDi_data, xa_tail_buf, CD_XA_TAIL);
if (sbpro_type) OUT(CDo_sel_d_i,0x00);
DS[d].sbp_current++;
if (cmd_type==READ_M2)
{
DPRINTF((DBG_XA,"SBPCD: xa_head:"));
for (xa_count=0;xa_count<CD_XA_HEAD;xa_count++)
DPRINTF((DBG_XA," %02X", xa_head_buf[xa_count]));
DPRINTF((DBG_XA,"\n"));
}
data_tries++;
data_retrying = 0;
if (data_tries >= 1000)
......
......@@ -73,7 +73,7 @@
int last_retran;
static unsigned char *encode(unsigned char *cp,int n);
static unsigned char *encode(unsigned char *cp, unsigned short n);
static long decode(unsigned char **cpp);
static unsigned char * put16(unsigned char *cp, unsigned short x);
static unsigned short pull16(unsigned char **cpp);
......@@ -160,7 +160,7 @@ slhc_free(struct slcompress *comp)
/* Put a short in host order into a char array in network order */
static unsigned char *
static inline unsigned char *
put16(unsigned char *cp, unsigned short x)
{
*cp++ = x >> 8;
......@@ -172,7 +172,7 @@ put16(unsigned char *cp, unsigned short x)
/* Encode a number */
unsigned char *
encode(unsigned char *cp, int n)
encode(unsigned char *cp, unsigned short n)
{
if(n >= 256 || n == 0){
*cp++ = 0;
......
......@@ -15,11 +15,8 @@
* disk change. This is where it fits best, I think, as it should
* invalidate changed floppy-disk-caches.
*/
#include <stdarg.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/major.h>
......@@ -195,7 +192,7 @@ static int sync_buffers(dev_t dev, int wait)
if (wait && bh->b_req && !bh->b_lock &&
!bh->b_dirt && !bh->b_uptodate) {
err = 1;
printk("Weird - unlocked, clean and not uptodate buffer on list %d\n", nlist);
printk("Weird - unlocked, clean and not uptodate buffer on list %d %x %lu\n", nlist, bh->b_dev, bh->b_blocknr);
continue;
}
/* Don't write clean buffers. Don't write ANY buffers
......@@ -1867,7 +1864,7 @@ asmlinkage int sys_bdflush(int func, int data)
repeat:
bh = lru_list[nlist];
if(bh)
for (i = nr_buffers_type[nlist]; --i > 0 && ndirty < bdf_prm.b_un.ndirty;
for (i = nr_buffers_type[nlist]; i-- > 0 && ndirty < bdf_prm.b_un.ndirty;
bh = next) {
/* We may have stalled while waiting for I/O to complete. */
if(bh->b_list != nlist) goto repeat;
......@@ -1909,8 +1906,10 @@ asmlinkage int sys_bdflush(int func, int data)
if(nr_buffers_type[BUF_DIRTY] < (nr_buffers - nr_buffers_type[BUF_SHARED]) *
bdf_prm.b_un.nfract/100) {
if (current->signal & (1 << (SIGKILL-1)))
if (current->signal & (1 << (SIGKILL-1))) {
bdflush_running--;
return 0;
}
current->signal = 0;
interruptible_sleep_on(&bdflush_wait);
}
......
......@@ -477,6 +477,15 @@ void isofs_read_inode(struct inode * inode)
brelse(bh);
inode->i_op = NULL;
/* A volume number of 0 is nonsense. Disable checking if we see
this */
if (inode->i_sb->u.isofs_sb.s_cruft == 'n' &&
isonum_723 (raw_inode->volume_sequence_number) == 0) {
printk("Warning: defective cdrom. Enabling \"cruft\" mount option.\n");
inode->i_sb->u.isofs_sb.s_cruft = 'y';
}
if (inode->i_sb->u.isofs_sb.s_cruft != 'y' &&
isonum_723 (raw_inode->volume_sequence_number) != 1) {
printk("Multi volume CD somehow got mounted.\n");
......
......@@ -74,7 +74,8 @@
#define DBG_UPC 21 /* show UPC information */
#define DBG_XA 22 /* XA mode debugging */
#define DBG_LCK 23 /* door (un)lock info */
#define DBG_000 24 /* unnecessary information */
#define DBG_SQ 24 /* dump SubQ frame */
#define DBG_000 25 /* unnecessary information */
/*==========================================================================*/
/*==========================================================================*/
......@@ -215,6 +216,7 @@
#define CD_FRAMESIZE 2048 /* bytes per frame, data mode */
#define CD_FRAMESIZE_XA 2340 /* bytes per frame, "xa" mode */
#define CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */
#define CD_FRAMESIZE_SUB 96 /* subchannel data size */
#define CD_BLOCK_OFFSET 150 /* offset of first logical frame */
#define CD_XA_HEAD 12 /* header size of XA frame */
#define CD_XA_TAIL 280 /* tail size of XA frame */
......
......@@ -219,8 +219,10 @@ struct task_struct {
unsigned short used_math;
unsigned short rss; /* number of resident pages */
char comm[16];
/* virtual 86 mode stuff */
struct vm86_struct * vm86_info;
unsigned long screen_bitmap;
unsigned long v86flags, v86mask, v86mode;
/* file system info */
int link_count;
int tty; /* -1 if no tty, so it must be signed */
......@@ -286,7 +288,7 @@ struct task_struct {
/* math */ 0, \
/* rss */ 2, \
/* comm */ "swapper", \
/* vm86_info */ NULL, 0, \
/* vm86_info */ NULL, 0, 0, 0, 0, \
/* fs info */ 0,-1,0022,NULL,NULL,NULL,NULL, \
/* ipc */ NULL, NULL, \
/* filp */ {NULL,}, \
......
#ifndef _LINUX_VM86_H
#define _LINUX_VM86_H
/*
* I'm guessing at the VIF/VIP flag usage, but hope that this is how
* the Pentium uses them. Linux will return from vm86 mode when both
* VIF and VIP is set.
*
* On a Pentium, we could probably optimize the virtual flags directly
* in the eflags register instead of doing it "by hand" in vflags...
*
* Linus
*/
#define TF_MASK 0x00000100
#define IF_MASK 0x00000200
#define IOPL_MASK 0x00003000
#define NT_MASK 0x00004000
#define VM_MASK 0x00020000
#define AC_MASK 0x00040000
#define VIF_MASK 0x00080000 /* virtual interrupt flag */
#define VIP_MASK 0x00100000 /* virtual interrupt pending */
#define ID_MASK 0x00200000
#define BIOSSEG 0x0f000
#define CPU_086 0
#define CPU_186 1
#define CPU_286 2
#define CPU_386 3
#define CPU_486 4
#define CPU_586 5
/*
* Return values for the 'vm86()' system call
*/
#define VM86_TYPE(retval) ((retval) & 0xff)
#define VM86_ARG(retval) ((retval) >> 8)
#define VM86_SIGNAL 0 /* return due to signal */
#define VM86_UNKNOWN 1 /* unhandled GP fault - IO-instruction or similar */
#define VM86_INTx 2 /* int3/int x instruction (ARG = x) */
#define VM86_STI 3 /* sti/popfl instruction enabled virtual interrupts */
/*
* This is the stack-layout when we have done a "SAVE_ALL" from vm86
......@@ -53,26 +81,36 @@ struct vm86_regs {
unsigned short gs, __gsh;
};
struct revectored_struct {
unsigned long __map[8]; /* 256 bits */
};
struct vm86_struct {
struct vm86_regs regs;
unsigned long flags;
unsigned long screen_bitmap;
unsigned long v_eflags;
unsigned long cpu_type;
unsigned long return_if_iflag;
unsigned char int_revectored[0x100];
unsigned char int21_revectored[0x100];
struct revectored_struct int_revectored;
struct revectored_struct int21_revectored;
};
/*
* flags masks
*/
#define VM86_SCREEN_BITMAP 1
#define VM86_SCREEN_BITMAP 0x0001
#ifdef __KERNEL__
void handle_vm86_fault(struct vm86_regs *, long);
extern inline int is_revectored(int nr, struct revectored_struct * bitmap)
{
__asm__ __volatile__("btl %2,%%fs:%1\n\tsbbl %0,%0"
:"=r" (nr)
:"m" (*bitmap),"r" (nr));
return nr;
}
#endif
#endif
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