Commit fb3ed0dc authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.68

parent 079e34c1
......@@ -539,6 +539,13 @@ S: Ormond
S: Victoria 3163
S: Australia
N: Pauline Middelink
E: middelin@polyware.iaf.nl
D: General low-level bug fixes, /proc fixes, identd support
S: Boterkorfhoek 34
S: 7546 JA Enschede
S: Netherlands
N: Rick Miller
E: rick@discus.mil.wi.us
D: Linux Device Registrar (Major/minor numbers), "au-play", "bwBASIC"
......
VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 67
SUBLEVEL = 68
ARCH = i386
......
......@@ -2773,7 +2773,7 @@ cdu31a_setup(char *strings,
{
irq_used = ints[2];
}
if (*strings != '\0')
if ((strings != NULL) && (*strings != '\0'))
{
if (strcmp(strings, "PAS") == 0)
{
......
......@@ -2106,7 +2106,7 @@ void update_screen(int new_console)
}
lock = 1;
#ifdef CONFIG_SELECTION
highlight_pointer(fg_console,-1);
clear_selection();
#endif /* CONFIG_SELECTION */
if (!console_blanked)
get_scrmem(fg_console);
......@@ -2148,7 +2148,7 @@ int do_screendump(int arg, int mode)
/* mode 0 needs 2+wd*ht, modes 1 and 2 need 4+2*wd*ht */
chcount=video_num_columns*video_num_lines;
l = verify_area(mode==2 ? VERIFY_READ :VERIFY_WRITE,
buf, (2+chcount)*(1+mode!=0));
buf, (2+chcount)*(mode ? 2 : 1));
if (l)
return l;
if (mode<2) {
......@@ -2162,12 +2162,14 @@ int do_screendump(int arg, int mode)
put_fs_byte(*sptr++,buf++);
break;
case 1:
#ifdef CONFIG_SELECTION
clear_selection();
#endif
put_fs_byte((char)x,buf++); put_fs_byte((char)y,buf++);
memcpy_tofs(buf,(char *)origin,2*chcount);
break;
case 2:
buf+=2; /* skip the the numnber 9 and console number */
x=get_fs_byte(buf++); y=get_fs_byte(buf++);
buf+=4; /* ioctl#, console#, x,y */
memcpy_fromfs((char *)origin,buf,2*chcount);
break;
}
......@@ -2356,7 +2358,6 @@ int set_selection(const int arg, struct tty_struct *tty)
case 3: /* pointer highlight */
if (sel_cons != currcons)
{
highlight_pointer(sel_cons,-1);
clear_selection();
sel_cons = currcons;
}
......@@ -2491,7 +2492,8 @@ static void clear_selection()
*/
#define colourmap ((char *)0xa0000)
/* Pauline Middelink reports that we should use 0xA0000 for the bwmap as well.. */
/* Pauline Middelink <middelin@polyware.iaf.nl> reports that we
should use 0xA0000 for the bwmap as well.. */
#define blackwmap ((char *)0xa0000)
#define cmapsz 8192
#define seq_port_reg (0x3c4)
......
......@@ -3,5 +3,6 @@ MODULES = \
de600.o \
de620.o \
3c501.o \
eexpress.o \
plip.o \
8390.o
......@@ -17,6 +17,8 @@
Move the theory of operation and memory map documentation.
Rework the board error reset
The statistics need to be updated correctly.
Modularized my Pauline Middelink <middelin@polyware.iaf.nl>
*/
static char *version =
......@@ -53,6 +55,10 @@ static char *version =
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#ifdef MODULE
#include <linux/module.h>
#include "../../tools/version.h"
#endif
#include <linux/malloc.h>
......@@ -435,6 +441,9 @@ eexp_open(struct device *dev)
dev->tbusy = 0;
dev->interrupt = 0;
dev->start = 1;
#ifdef MODULE
MOD_INC_USE_COUNT;
#endif
return 0;
}
......@@ -647,6 +656,9 @@ eexp_close(struct device *dev)
/* Update the statistics here. */
#ifdef MODULE
MOD_DEC_USE_COUNT;
#endif
return 0;
}
......@@ -981,6 +993,32 @@ eexp_rx(struct device *dev)
outw(saved_write_ptr, ioaddr + WRITE_PTR);
}
#ifdef MODULE
char kernel_version[] = UTS_RELEASE;
static struct device dev_eexpress = {
" " /*"eexpress"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, express_probe };
int
init_module(void)
{
if (register_netdev(&dev_eexpress) != 0)
return -EIO;
return 0;
}
void
cleanup_module(void)
{
if (MOD_IN_USE)
printk("express: device busy, remove delayed\n");
else
{
unregister_netdev(&dev_eexpress);
kfree_s(dev_eexpress.priv,sizeof(struct net_local));
dev_eexpress.priv=NULL;
}
}
#endif /* MODULE */
/*
* Local variables:
* compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -I/usr/src/linux/drivers/net -Wall -Wstrict-prototypes -O6 -m486 -c eexpress.c"
......
......@@ -545,7 +545,7 @@ plip_device_clear(struct device *dev)
enable_irq(dev->irq);
}
/* PLIP_ERROR --- wait til other end setteled */
/* PLIP_ERROR --- wait til other end settled */
static int
plip_error(struct device *dev)
{
......
......@@ -2424,7 +2424,7 @@ static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd) {
tmp->select[0] = IDENTIFY (0, cmd->lun);
#endif
patch_dsa_32(tmp->dsa, dsa_msgout, 1, tmp->select);
patch_dsa_32(tmp->dsa, dsa_cmdout, 0, COMMAND_SIZE(cmd->cmnd[0]));
patch_dsa_32(tmp->dsa, dsa_cmdout, 0, cmd->cmd_len);
patch_dsa_32(tmp->dsa, dsa_cmdout, 1, cmd->cmnd);
patch_dsa_32(tmp->dsa, dsa_dataout, 0, cmd_dataout ?
cmd_dataout : hostdata->script + hostdata->E_other_transfer /
......@@ -3742,10 +3742,6 @@ int NCR53c7xx_reset (Scsi_Cmnd *cmd) {
return SCSI_RESET_SNOOZE;
}
const char *NCR53c7xx_info (void) {
return("More info here\n");
}
/*
* The NCR SDMS bios follows Annex A of the SCSI-CAM draft, and
* therefore shares the scsicam_bios_param function.
......
......@@ -50,12 +50,11 @@
#include <linux/scsicam.h>
extern int NCR53c7xx_abort(Scsi_Cmnd *);
extern int NCR53c7xx_detect(Scsi_Host_Template *tpnt);
extern const char *NCR53c7xx_info(void);
extern int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
extern int NCR53c7xx_reset(Scsi_Cmnd *);
#define NCR53c7xx {NULL, "NCR53c{7,8}xx (rel 3)", NCR53c7xx_detect, \
NULL, NCR53c7xx_info, \
#define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 3)", NCR53c7xx_detect, \
NULL, NULL, \
NULL, NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset,\
NULL, scsicam_bios_param, \
/* can queue */ 1, /* id */ 7, 255 /* old SG_ALL */, \
......
......@@ -2306,7 +2306,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) {
msgout = NOP;
break;
case PHASE_CMDOUT:
len = COMMAND_SIZE(cmd->cmnd[0]);
len = cmd->cmd_len;
data = cmd->cmnd;
/*
* XXX for performance reasons, on machines with a
......
......@@ -268,8 +268,6 @@
#define P_BUSFREE 1
#define P_PARITY 2
static char *aha152x_id = AHA152X_REVID;
static int port_base = 0;
static int this_host = 0;
static int can_disconnect = 0;
......@@ -734,14 +732,6 @@ int aha152x_detect(Scsi_Host_Template * tpnt)
return 1;
}
/*
* return the name of the thing
*/
const char *aha152x_info(void)
{
return(aha152x_id);
}
/*
* Queue a command and setup interrupts for a free bus.
*/
......@@ -1590,14 +1580,14 @@ void aha152x_intr( int irqno )
if(aha152x_debug & debug_cmd)
{
printk("DFIFOEMP, outsw (%d words), ",
COMMAND_SIZE(current_SC->cmnd[0])>>1);
current_SC->cmd_len >>1 );
disp_ports();
}
#endif
outsw( DATAPORT,
&current_SC->cmnd,
COMMAND_SIZE(current_SC->cmnd[0])>>1 );
current_SC->cmd_len >>1 );
#if defined(DEBUG_CMD)
if(aha152x_debug & debug_cmd)
......@@ -1622,7 +1612,7 @@ void aha152x_intr( int irqno )
#if defined(DEBUG_CMD) || defined(DEBUG_INTR)
if(debug_cmd & debug_intr)
printk("sent %d/%d command bytes, ", GETSTCNT(),
COMMAND_SIZE(current_SC->cmnd[0]));
current_SC->cmd_len);
#endif
}
......
......@@ -12,7 +12,6 @@
#include <asm/io.h>
int aha152x_detect(Scsi_Host_Template *);
const char *aha152x_info(void);
int aha152x_command(Scsi_Cmnd *);
int aha152x_queue(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int aha152x_abort(Scsi_Cmnd *);
......@@ -27,10 +26,11 @@ int aha152x_biosparam(Disk *, int, int*);
/* Initial value of Scsi_Host entry */
#define AHA152X { /* next */ NULL, \
/* usage_count */ NULL, \
/* name */ AHA152X_REVID, \
/* detect */ aha152x_detect, \
/* release */ NULL, \
/* info */ aha152x_info, \
/* info */ NULL, \
/* command */ aha152x_command, \
/* queuecommand */ aha152x_queue, \
/* abort */ aha152x_abort, \
......
......@@ -10,6 +10,8 @@
* have the bios enabled to use the aha1542.
* Modified by David Gentzel
* Don't call request_dma if dma mask is 0 (for BusLogic BT-445S VL-Bus controller).
* Modified by Matti Aarnio
* Accept parameters from LILO cmd-line. -- 1-Oct-94
*/
#include <linux/kernel.h>
......@@ -43,9 +45,38 @@ static const char RCSid[] = "$Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/aha
/* The adaptec can be configured for quite a number of addresses, but
I generally do not want the card poking around at random. We allow
two addresses - this allows people to use the Adaptec with a Midi
card, which also used 0x330 */
card, which also used 0x330 -- can be overriden with LILO! */
#define MAXBOARDS 2 /* Increase this and the sizes of the
arrays below, if you need more.. */
static unsigned int bases[MAXBOARDS]={0x330, 0x334};
/* set by aha1542_setup according to the command line */
static int setup_called[MAXBOARDS] = {0,0};
static int setup_buson[MAXBOARDS] = {0,0};
static int setup_busoff[MAXBOARDS] = {0,0};
static int setup_dmaspeed[MAXBOARDS] = {-1,-1};
static char *setup_str[MAXBOARDS] = {(char *)NULL,(char *)NULL};
/*
* LILO params: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
*
* Where: <PORTBASE> is any of the valid AHA addresses:
* 0x130, 0x134, 0x230, 0x234, 0x330, 0x334
* <BUSON> is the time (in microsecs) that AHA spends on the AT-bus
* when transferring data. 1542A power-on default is 11us,
* valid values are in range: 2..15 (decimal)
* <BUSOFF> is the time that AHA spends OFF THE BUS after while
* it is transferring data (not to monopolize the bus).
* Power-on default is 4us, valid range: 1..64 microseconds.
* <DMASPEED> Default is jumper selected (1542A: on the J1),
* but experimenter can alter it with this.
* Valid values: 5, 6, 7, 8, 10 (MB/s)
* Factory default is 5 MB/s.
*/
static unsigned int bases[]={0x330, 0x334};
/* The DMA-Controller. We need to fool with this because we want to
be able to use the aha1542 without having to have the bios enabled */
......@@ -253,6 +284,7 @@ static int aha1542_test_port(int bse, struct Scsi_Host * shpnt)
/* In case some other card was probing here, reset interrupts */
aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
outb(SRST|IRST/*|SCRST*/, CONTROL(bse));
i = jiffies + 2;
......@@ -302,14 +334,6 @@ static int aha1542_test_port(int bse, struct Scsi_Host * shpnt)
return 0; /* 0 = not ok */
}
static const char aha_ident[] = "Adaptec 1542";
/* What's this little function for? */
const char *aha1542_info(void)
{
return aha_ident;
}
/* A "high" level interrupt handler */
static void aha1542_intr_handle(int foo)
{
......@@ -513,7 +537,7 @@ int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
printk("aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
aha1542_stat();
printk("aha1542_queuecommand: dumping scsi cmd:");
for (i = 0; i < (COMMAND_SIZE(*cmd)); i++) printk("%02x ", cmd[i]);
for (i = 0; i < SCpnt->cmd_len; i++) printk("%02x ", cmd[i]);
printk("\n");
if (*cmd == WRITE_10 || *cmd == WRITE_6)
return 0; /* we are still testing, so *don't* write */
......@@ -549,7 +573,7 @@ int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
memset(&ccb[mbo], 0, sizeof(struct ccb));
ccb[mbo].cdblen = COMMAND_SIZE(*cmd); /* SCSI Command Descriptor Block Length */
ccb[mbo].cdblen = SCpnt->cmd_len;
direction = 0;
if (*cmd == READ_10 || *cmd == READ_6)
......@@ -590,7 +614,6 @@ int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
any2scsi(cptr[i].datalen, sgpnt[i].length);
};
any2scsi(ccb[mbo].datalen, SCpnt->use_sg * sizeof(struct chain));
if(((unsigned int) buff & 0xff000000)) goto baddma;
any2scsi(ccb[mbo].dataptr, cptr);
#ifdef DEBUG
printk("cptr %x: ",cptr);
......@@ -601,6 +624,7 @@ int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
ccb[mbo].op = 0; /* SCSI Initiator Command */
SCpnt->host_scribble = NULL;
any2scsi(ccb[mbo].datalen, bufflen);
if(((unsigned int) buff & 0xff000000)) goto baddma;
any2scsi(ccb[mbo].dataptr, buff);
};
ccb[mbo].idlun = (target&7)<<5 | direction | (lun & 7); /*SCSI Target Id*/
......@@ -813,6 +837,66 @@ static int aha1542_query(int base_io, int * transl)
return 0;
}
/* called from init/main.c */
void aha1542_setup( char *str, int *ints)
{
char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
static int setup_idx = 0;
int setup_portbase;
if(setup_idx >= MAXBOARDS)
{
printk("aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
printk(" Entryline 1: %s\n",setup_str[0]);
printk(" Entryline 2: %s\n",setup_str[1]);
printk(" This line: %s\n",str);
return;
}
if (ints[0] < 1 || ints[0] > 4)
{
printk("aha1542: %s\n", str );
printk(ahausage);
printk("aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
}
setup_called[setup_idx]=ints[0];
setup_str[setup_idx]=str;
setup_portbase = ints[0] >= 1 ? ints[1] : 0; /* Preserve the default value.. */
setup_buson [setup_idx] = ints[0] >= 2 ? ints[2] : 7;
setup_busoff [setup_idx] = ints[0] >= 3 ? ints[3] : 5;
if (ints[0] >= 4) {
int atbt = -1;
switch (ints[4]) {
case 5:
atbt = 0x00;
break;
case 6:
atbt = 0x04;
break;
case 7:
atbt = 0x01;
break;
case 8:
atbt = 0x02;
break;
case 10:
atbt = 0x03;
break;
default:
printk("aha1542: %s\n", str );
printk(ahausage);
printk("aha1542: Valid values for DMASPEED are 5-8, 10 MB/s. Using jumper defaults.\n");
break;
}
setup_dmaspeed[setup_idx] = atbt;
}
if (setup_portbase != 0)
bases[setup_idx] = setup_portbase;
++setup_idx;
}
/* return non-zero on detection */
int aha1542_detect(Scsi_Host_Template * tpnt)
......@@ -826,12 +910,19 @@ int aha1542_detect(Scsi_Host_Template * tpnt)
int indx;
DEB(printk("aha1542_detect: \n"));
for(indx = 0; indx < sizeof(bases)/sizeof(bases[0]); indx++)
if(!check_region(bases[indx], 4)) {
if(bases[indx] != 0 && !check_region(bases[indx], 4)) {
shpnt = scsi_register(tpnt,
sizeof(struct aha1542_hostdata));
/* For now we do this - until kmalloc is more intelligent
we are resigned to stupid hacks like this */
if ((unsigned int) shpnt > 0xffffff) {
printk("Invalid address for shpnt with 1542.\n");
goto unregister;
}
if(!aha1542_test_port(bases[indx], shpnt)) goto unregister;
......@@ -841,6 +932,12 @@ int aha1542_detect(Scsi_Host_Template * tpnt)
{
unchar oncmd[] = {CMD_BUSON_TIME, 7};
unchar offcmd[] = {CMD_BUSOFF_TIME, 5};
if(setup_called[indx])
{
oncmd[1] = setup_buson[indx];
offcmd[1] = setup_busoff[indx];
}
aha1542_intr_reset(base_io);
aha1542_out(base_io, oncmd, 2);
......@@ -848,6 +945,14 @@ int aha1542_detect(Scsi_Host_Template * tpnt)
aha1542_intr_reset(base_io);
aha1542_out(base_io, offcmd, 2);
WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
if (setup_dmaspeed[indx] >= 0)
{
unchar dmacmd[] = {CMD_DMASPEED, 0};
dmacmd[1] = setup_dmaspeed[indx];
aha1542_intr_reset(base_io);
aha1542_out(base_io, dmacmd, 2);
WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
}
while (0) {
fail:
printk("aha1542_detect: setting bus on/off-time failed\n");
......@@ -889,6 +994,7 @@ int aha1542_detect(Scsi_Host_Template * tpnt)
}
aha_host[irq_level - 9] = shpnt;
shpnt->io_port = base_io;
shpnt->n_io_port = 4; /* Number of bytes of I/O space used */
shpnt->dma_channel = dma_chan;
shpnt->irq = irq_level;
HOSTDATA(shpnt)->bios_translation = trans;
......@@ -1120,3 +1226,12 @@ int aha1542_biosparam(Scsi_Disk * disk, int dev, int * ip)
/* if (ip[2] >= 1024) ip[2] = 1024; */
return 0;
}
#ifdef MODULE
/* Eventually this will go into an include file, but this will be later */
Scsi_Host_Template driver_template = AHA1542;
#include "scsi_module.c"
#endif
......@@ -69,6 +69,7 @@
#define CMD_EMBOI 0x05 /* Enable MailBox Out Interrupt */
#define CMD_BUSON_TIME 0x07 /* Set Bus-On Time */
#define CMD_BUSOFF_TIME 0x08 /* Set Bus-Off Time */
#define CMD_DMASPEED 0x09 /* Set AT Bus Transfer Speed */
#define CMD_RETDEVS 0x0a /* Return Installed Devices */
#define CMD_RETCONF 0x0b /* Return Configuration Data */
#define CMD_RETSETUP 0x0d /* Return Setup Data */
......@@ -132,7 +133,6 @@ int aha1542_detect(Scsi_Host_Template *);
int aha1542_command(Scsi_Cmnd *);
int aha1542_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int aha1542_abort(Scsi_Cmnd *);
const char *aha1542_info(void);
int aha1542_reset(Scsi_Cmnd *);
int aha1542_biosparam(Disk *, int, int*);
......@@ -144,11 +144,11 @@ int aha1542_biosparam(Disk *, int, int*);
#define NULL 0
#endif
#define AHA1542 { NULL, \
#define AHA1542 { NULL, NULL, \
"Adaptec 1542", \
aha1542_detect, \
NULL, \
aha1542_info, \
NULL, \
aha1542_command, \
aha1542_queuecommand, \
aha1542_abort, \
......
......@@ -163,12 +163,6 @@ int aha1740_test_port(void)
return 0;
}
const char *aha1740_info(void)
{
static char buffer[] = "Adaptec 174x (EISA)";
return buffer;
}
/* A "high" level interrupt handler */
void aha1740_intr_handle(int foo)
{
......@@ -273,7 +267,7 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
i = -1;
printk("aha1740_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
printk("scsi cmd:");
for (i = 0; i < (COMMAND_SIZE(*cmd)); i++) printk("%02x ", cmd[i]);
for (i = 0; i < SCpnt->cmd_len; i++) printk("%02x ", cmd[i]);
printk("\n");
#endif
......@@ -302,7 +296,7 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
printk("Sending command (%d %x)...",ecbno, done);
#endif
ecb[ecbno].cdblen = COMMAND_SIZE(*cmd); /* SCSI Command Descriptor Block Length */
ecb[ecbno].cdblen = SCpnt->cmd_len; /* SCSI Command Descriptor Block Length */
direction = 0;
if (*cmd == READ_10 || *cmd == READ_6)
......
......@@ -156,7 +156,6 @@ int aha1740_detect(Scsi_Host_Template *);
int aha1740_command(Scsi_Cmnd *);
int aha1740_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int aha1740_abort(Scsi_Cmnd *);
const char *aha1740_info(void);
int aha1740_reset(Scsi_Cmnd *);
int aha1740_biosparam(Disk *, int, int*);
......@@ -167,11 +166,11 @@ int aha1740_biosparam(Disk *, int, int*);
#define NULL 0
#endif
#define AHA1740 {NULL, \
"Adaptec 1740", \
#define AHA1740 {NULL, NULL, \
"Adaptec 174x (EISA)", \
aha1740_detect, \
NULL, \
aha1740_info, \
NULL, \
aha1740_command, \
aha1740_queuecommand, \
aha1740_abort, \
......
......@@ -1033,11 +1033,11 @@ int aha274x_detect(Scsi_Host_Template *template)
found += aha274x_register(template, type, base);
}
}
template->name = (char *)aha274x_info();
template->name = (char *)aha274x_info(NULL);
return(found);
}
const char *aha274x_info(void)
const char *aha274x_info(struct Scsi_Host * shost)
{
return("Adaptec AHA274x/284x (EISA/VL-bus -> Fast SCSI) "
AHA274X_SEQ_VERSION "/"
......@@ -1100,7 +1100,7 @@ void aha274x_buildscb(struct aha274x_host *p,
* little-endian format.
*/
addr = cmd->cmnd;
scb->SCSI_cmd_length = COMMAND_SIZE(cmd->cmnd[0]);
scb->SCSI_cmd_length = cmd->cmd_len;
memcpy(scb->SCSI_cmd_pointer, &addr, sizeof(scb->SCSI_cmd_pointer));
if (cmd->use_sg) {
......@@ -1155,7 +1155,7 @@ int aha274x_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
#if 0
debug("aha274x_queue: cmd 0x%x (size %u), target %d, lun %d\n",
cmd->cmnd[0],
COMMAND_SIZE(cmd->cmnd[0]),
cmd->cmd_len,
cmd->target,
cmd->lun);
#endif
......
......@@ -32,7 +32,8 @@
*/
#define AHA274X { \
NULL, \
"", \
NULL, \
NULL, \
aha274x_detect, \
NULL, \
aha274x_info, \
......@@ -57,6 +58,6 @@ extern int aha274x_detect(Scsi_Host_Template *);
extern int aha274x_command(Scsi_Cmnd *);
extern int aha274x_abort(Scsi_Cmnd *);
extern int aha274x_reset(Scsi_Cmnd *);
extern const char *aha274x_info(void);
extern const char *aha274x_info(struct Scsi_Host *);
#endif
This diff is collapsed.
......@@ -20,15 +20,14 @@ int buslogic_reset(Scsi_Cmnd *);
int buslogic_biosparam(Disk *, int, int *);
#define BUSLOGIC_CMDLUN 1 /* Do not set this too high. It sucks
up lots of memory on machines with > 16Mb
because of the huge number of bounce
buffers that need to be allocated.
up lots of memory on ISA machines
with > 16MB because of the huge number of
bounce buffers that need to be allocated.
For boards that use non-ISA bus, we can
bump this in the board detect routine.
10/8/94 ERY */
10/8/94 ERY */
#define BUSLOGIC { NULL, \
#define BUSLOGIC { NULL, \
"BusLogic", \
buslogic_detect, \
NULL, \
......@@ -65,8 +64,11 @@ int buslogic_biosparam(Disk *, int, int *);
#define BD_ABORT 0x0001
#define BD_COMMAND 0x0002
#define BD_DETECT 0x0004
#define BD_INTERRUPT 0x0008
#define BD_RESET 0x0010
#define BD_ERRORS 0x0008
#define BD_INTERRUPT 0x0010
#define BD_IO 0x0020
#define BD_RESET 0x0040
#define BD_UNDOCUMENTED 0x0080
/* I/O Port interface */
/* READ */
......@@ -77,18 +79,27 @@ int buslogic_biosparam(Disk *, int, int *);
#define HARDY 0x10 /* Host Adapter Ready */
#define CPRBSY 0x08 /* Command/Parameter Register Busy */
#define DIRRDY 0x04 /* Data In Register Ready */
/* 0x02 is reserved */
#define CMDINV 0x01 /* Command Invalid */
#define STATMASK 0xFD /* 0x02 is reserved */
#define DATA_IN(base) (STATUS(base) + 1)
#define INTERRUPT(base) (STATUS(base) + 2)
#define INTV 0x80 /* Interrupt Valid */
/* 0x70 are reserved */
#define RSTS 0x08 /* SCSI Reset State */
#define CMDC 0x04 /* Command Complete */
#define MBOR 0x02 /* Mailbox Out Ready */
#define IMBL 0x01 /* Incoming Mailbox Loaded */
#define INTRMASK 0x8F /* 0x70 are reserved */
#define INTRMASK 0x8F
/* This undocumented port returns a bitmask indicating geometry translation. */
#define GEOMETRY(base) (STATUS(base) + 3)
#define GEO_GT_1GB 0x80 /* > 1GB under DOS geometry mapping */
/* 0x70 are unknown */
#define GEO_XLATION_S_D1 0x0C /* Disk 1 geometry ("S" models only) */
#define GEO_XLATION_S_D0 0x03 /* Disk 0 geometry ("S" models only) */
/* WRITE */
#define CONTROL(base) STATUS(base)
......@@ -96,6 +107,7 @@ int buslogic_biosparam(Disk *, int, int *);
#define RSOFT 0x40 /* Soft Reset */
#define RINT 0x20 /* Interrupt Reset */
#define RSBUS 0x10 /* SCSI Bus Reset */
/* 0x0F are reserved */
#define COMMAND_PARAMETER(base) (STATUS(base) + 1)
#define CMD_TSTCMDCINT 0x00 /* Test CMDC Interrupt */
......@@ -120,7 +132,13 @@ int buslogic_biosparam(Disk *, int, int *);
#define CMD_HA_DIAG 0x20 /* Host Adapter Diagnostic */
#define CMD_HA_OPTIONS 0x21 /* Host Adapter Options */
#define CMD_INITEXTMB 0x81 /* Initialize Extended Mailbox */
#define CMD_VER_NO_LAST 0x84 /* Version Number Last Byte (undocumented) */
#define CMD_VER_NO_LETTER 0x85 /* Version Number One Letter (undocumented) */
#define CMD_RET_MODEL_NO 0x8B /* Return Model Number (undocumented) */
#define CMD_INQEXTSETUP 0x8D /* Inquire Extended Set-up Information */
#define CMD_ROUND_ROBIN 0x8F /* Enable strict vs. half-assed round-robin
mailbox filling (undocumented) */
#define CMD_READ_FW_LCL_RAM 0x91/* Read Firmware Local RAM (undocumented) */
#define CMD_WRITE_INQ_BUF 0x9A /* Write Inquiry Data Buffer
(Target Mode Only) */
#define CMD_READ_INQ_BUF 0x9B /* Read Inquiry Data Buffer
......
......@@ -367,10 +367,6 @@ int eata_detect (Scsi_Host_Template * tpnt) {
return j;
}
const char *eata_info (void) {
return driver_name;
}
static inline void build_sg_list(struct mscp *cpp, Scsi_Cmnd *SCpnt) {
unsigned int k;
struct scatterlist * sgpnt;
......@@ -471,7 +467,7 @@ int eata_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
cpp->data_len = htonl(SCpnt->request_bufflen);
}
memcpy(cpp->cdb, SCpnt->cmnd, COMMAND_SIZE(*SCpnt->cmnd));
memcpy(cpp->cdb, SCpnt->cmnd, SCpnt->cmd_len);
/* Send control packet to the board */
if (do_dma(sh[j]->io_port, (unsigned int) cpp, SEND_CP_DMA)) {
......
......@@ -10,16 +10,16 @@
int eata_detect(Scsi_Host_Template *);
int eata_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int eata_abort(Scsi_Cmnd *);
const char *eata_info(void);
int eata_reset(Scsi_Cmnd *);
int eata_bios_param(Disk *, int, int*);
#define EATA { NULL, /* Ptr for modules */ \
NULL, /* usage count for modules */ \
"EISA EATA 2.0A rev. " EATA_VERSION " by " \
"Dario_Ballabio@milano.europe.dg.com.",\
"Dario_Ballabio@milano.europe.dg.com.", \
eata_detect, \
NULL, /* Release */ \
eata_info, \
NULL, \
NULL, \
eata_queuecommand, \
eata_abort, \
......
......@@ -375,9 +375,9 @@ struct signature {
#define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature ))
static void print_banner( void )
static void print_banner( struct Scsi_Host * shpnt )
{
printk( "%s", fdomain_16x0_info() );
printk( "%s", fdomain_16x0_info(shpnt) );
printk( "Future Domain: BIOS version %d.%d, %s\n",
bios_major, bios_minor,
chip == tmc1800 ? "TMC-1800"
......@@ -637,7 +637,7 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
return 0; /* Cannot find valid set of ports */
}
print_banner();
print_banner(NULL);
SCSI_Mode_Cntl_port = port_base + SCSI_Mode_Cntl;
FIFO_Data_Count_port = port_base + FIFO_Data_Count;
......@@ -755,7 +755,7 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
return 1;
}
const char *fdomain_16x0_info(void)
const char *fdomain_16x0_info(struct Scsi_Host * shpnt)
{
static char buffer[80];
char *pt;
......@@ -1014,7 +1014,7 @@ void fdomain_16x0_intr( int unused )
if (chip == tmc1800
&& !current_SC->SCp.have_data_in
&& (current_SC->SCp.sent_command
>= COMMAND_SIZE( current_SC->cmnd[ 0 ] ))) {
>= current_SC->cmd_len)) {
/* We have to get the FIFO direction
correct, so I've made a table based
on the SCSI Standard of which commands
......@@ -1376,7 +1376,7 @@ void print_info( Scsi_Cmnd *SCpnt )
unsigned int irr;
unsigned int isr;
print_banner();
print_banner(SCpnt->host);
switch (SCpnt->SCp.phase) {
case in_arbitration: printk( "arbitration " ); break;
case in_selection: printk( "selection " ); break;
......
......@@ -28,13 +28,13 @@
int fdomain_16x0_detect( Scsi_Host_Template * );
int fdomain_16x0_command( Scsi_Cmnd * );
int fdomain_16x0_abort( Scsi_Cmnd * );
const char *fdomain_16x0_info( void );
const char *fdomain_16x0_info( struct Scsi_Host * );
int fdomain_16x0_reset( Scsi_Cmnd * );
int fdomain_16x0_queue( Scsi_Cmnd *, void (*done)(Scsi_Cmnd *) );
int fdomain_16x0_biosparam( Disk *, int, int * );
#define FDOMAIN_16X0 { NULL, \
"Future Domain TMC-16x0", \
#define FDOMAIN_16X0 { NULL, NULL, \
NULL, \
fdomain_16x0_detect, \
NULL, \
fdomain_16x0_info, \
......
......@@ -35,7 +35,6 @@
#ifndef ASM
int generic_NCR5380_abort(Scsi_Cmnd *);
int generic_NCR5380_detect(Scsi_Host_Template *);
const char *generic_NCR5380_info(void);
int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int generic_NCR5380_reset(Scsi_Cmnd *);
......@@ -54,8 +53,8 @@ int generic_NCR5380_reset(Scsi_Cmnd *);
#ifdef HOSTS_C
#define GENERIC_NCR5380 {NULL, "Trantor T128/T128F/T228", \
generic_NCR5380_detect, NULL, generic_NCR5380_info, NULL, \
#define GENERIC_NCR5380 {NULL, NULL, "Trantor T128/T128F/T228", \
generic_NCR5380_detect, NULL, NULL, NULL, \
generic_NCR5380_queue_command, generic_NCR5380_abort, \
generic_NCR5380_reset, NULL, \
NULL, /* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \
......
......@@ -227,6 +227,7 @@ struct Scsi_Host * scsi_register(Scsi_Host_Template * tpnt, int j){
struct Scsi_Host * retval, *shpnt;
retval = (struct Scsi_Host *)scsi_init_malloc(sizeof(struct Scsi_Host) + j);
retval->host_busy = 0;
retval->block = NULL;
if(j > 0xffff) panic("Too many extra bytes requested\n");
retval->extra_bytes = j;
retval->loaded_as_module = scsi_loadable_module_flag;
......
......@@ -52,6 +52,9 @@ typedef struct SHT
/* Used with loadable modules so we can construct a linked list. */
struct SHT * next;
/* Used with loadable modules so that we know when it is safe to unload */
int * usage_count;
/*
The name pointer is a pointer to the name of the SCSI
device detected.
......@@ -77,14 +80,18 @@ typedef struct SHT
int (* detect)(struct SHT *);
/* Used with loadable modules to unload the host structures */
/* Used with loadable modules to unload the host structures. Note:
there is a default action built into the modules code which may
be sufficient for most host adapters. Thus you may not have to supply
this at all. */
int (*release)(struct Scsi_Host *);
/*
The info function will return whatever useful
information the developer sees fit.
information the developer sees fit. If not provided, then
the name field will be used instead.
*/
const char *(* info)(void);
const char *(* info)(struct Scsi_Host *);
/*
The command function takes a target, a command (this is a SCSI
......@@ -221,6 +228,8 @@ typedef struct SHT
be two Scsi_Host entries, but only 1 Scsi_Host_Template entries.
*/
#define SCSI_HOST_BLOCK 0x800
struct Scsi_Host
{
struct Scsi_Host * next;
......@@ -232,9 +241,15 @@ struct Scsi_Host
Scsi_Cmnd *host_queue;
Scsi_Host_Template * hostt;
/* Pointer to a circularly linked list - this indicates the hosts
that should be locked out of performing I/O while we have an active
command on this host. */
struct Scsi_Host * block;
/* These parameters should be set by the detect routine */
unsigned char *base;
short unsigned int io_port;
unsigned char n_io_port;
unsigned char irq;
unsigned char dma_channel;
/*
......
......@@ -399,7 +399,7 @@ static void in2000_intr_handle(int foo)
} /* end while intrpt active */
}
static int in2000_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
int in2000_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
{
unchar direction;
unchar *cmd = (unchar *) SCpnt->cmnd;
......@@ -551,7 +551,7 @@ static void internal_done(Scsi_Cmnd * SCpnt)
++internal_done_flag;
}
static int in2000_command(Scsi_Cmnd * SCpnt)
int in2000_command(Scsi_Cmnd * SCpnt)
{
in2000_queuecommand(SCpnt, internal_done);
......@@ -560,7 +560,7 @@ static int in2000_command(Scsi_Cmnd * SCpnt)
return internal_done_errcode;
}
static int in2000_detect(Scsi_Host_Template * tpnt)
int in2000_detect(Scsi_Host_Template * tpnt)
{
/* Order chosen to reduce conflicts with some multi-port serial boards */
int base_tab[] = { 0x220,0x200,0x110,0x100 };
......@@ -632,7 +632,7 @@ static int in2000_detect(Scsi_Host_Template * tpnt)
return 1;
}
static int in2000_abort(Scsi_Cmnd * SCpnt)
int in2000_abort(Scsi_Cmnd * SCpnt)
{
DEB(printk("in2000_abort\n"));
/*
......@@ -649,7 +649,7 @@ static inline void delay( unsigned how_long )
while (jiffies < time) ;
}
static int in2000_reset(Scsi_Cmnd * SCpnt)
int in2000_reset(Scsi_Cmnd * SCpnt)
{
DEB(printk("in2000_reset called\n"));
/*
......@@ -671,7 +671,7 @@ static int in2000_reset(Scsi_Cmnd * SCpnt)
#endif
}
static int in2000_biosparam(Disk * disk, int dev, int* iinfo)
int in2000_biosparam(Disk * disk, int dev, int* iinfo)
{
int size = disk->capacity;
DEB(printk("in2000_biosparam\n"));
......
......@@ -94,12 +94,12 @@
#define MAX_SENSE 14
#define MAX_STATUS 32
static int in2000_detect(Scsi_Host_Template *);
static int in2000_command(Scsi_Cmnd *);
static int in2000_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
static int in2000_abort(Scsi_Cmnd *);
static int in2000_reset(Scsi_Cmnd *);
static int in2000_biosparam(Disk *, int, int*);
int in2000_detect(Scsi_Host_Template *);
int in2000_command(Scsi_Cmnd *);
int in2000_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int in2000_abort(Scsi_Cmnd *);
int in2000_reset(Scsi_Cmnd *);
int in2000_biosparam(Disk *, int, int*);
#ifndef NULL
......@@ -108,7 +108,7 @@ static int in2000_biosparam(Disk *, int, int*);
/* next may be "SG_NONE" or "SG_ALL" or nr. of (1k) blocks per R/W Cmd. */
#define IN2000_SG SG_ALL
#define IN2000 {NULL, "Always IN2000", in2000_detect, NULL, \
#define IN2000 {NULL, NULL, "Always IN2000", in2000_detect, NULL, \
NULL, in2000_command, \
in2000_queuecommand, \
in2000_abort, \
......
......@@ -525,17 +525,4 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src
return 0;
}
/*
* Function : const char *pas16_info(void)
*
* Purpose : provide further information about this driver.
*
* Returns : an empty string.
*/
const char *pas16_info (void) {
static const char string[]="";
return string;
}
#include "NCR5380.c"
......@@ -117,7 +117,6 @@
int pas16_abort(Scsi_Cmnd *);
int pas16_biosparam(Disk *, int, int*);
int pas16_detect(Scsi_Host_Template *);
const char *pas16_info(void);
int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int pas16_reset(Scsi_Cmnd *);
......@@ -141,8 +140,8 @@ int pas16_reset(Scsi_Cmnd *);
#ifdef HOSTS_C
#define MV_PAS16 {NULL, "Pro Audio Spectrum-16 SCSI", \
pas16_detect, NULL, pas16_info, \
#define MV_PAS16 {NULL, NULL, "Pro Audio Spectrum-16 SCSI", \
pas16_detect, NULL, NULL, \
NULL, pas16_queue_command, pas16_abort, pas16_reset, NULL, \
pas16_biosparam, \
/* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \
......
......@@ -258,7 +258,7 @@ unsigned int i;
outb(0x99, qbase + 5); /* timer */
outb(cmd->target, qbase + 4);
for (i = 0; i < COMMAND_SIZE(cmd->cmnd[0]); i++)
for (i = 0; i < cmd->cmd_len; i++)
outb(cmd->cmnd[i], qbase + 2);
qlcmd = cmd;
outb(0x41, qbase + 3); /* select and send command */
......@@ -558,7 +558,7 @@ int qlogic_reset(Scsi_Cmnd * cmd)
/*----------------------------------------------------------------*/
/* return info string */
const char *qlogic_info()
const char *qlogic_info(struct Scsi_Host * host)
{
return qinfo;
}
......@@ -2,7 +2,7 @@
#define _QLOGIC_H
int qlogic_detect(Scsi_Host_Template * );
const char * qlogic_info(void);
const char * qlogic_info(struct Scsi_Host *);
int qlogic_command(Scsi_Cmnd *);
int qlogic_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
int qlogic_abort(Scsi_Cmnd *);
......@@ -14,6 +14,7 @@ int qlogic_biosparam(Disk *,int,int[]);
#endif
#define QLOGIC { \
NULL, \
NULL, \
NULL, \
qlogic_detect, \
......
......@@ -269,8 +269,10 @@ static void scan_scsis (struct Scsi_Host * shpnt)
SCmd.target = dev;
SCmd.lun = lun;
SCmd.request.sem = NULL; /* Used for mutex if loading devices after boot */
SCmd.request.dev = 0xffff; /* Mark not busy */
SCmd.use_sg = 0;
SCmd.cmd_len = 0;
SCmd.old_use_sg = 0;
SCmd.transfersize = 0;
SCmd.underflow = 0;
......@@ -316,6 +318,7 @@ static void scan_scsis (struct Scsi_Host * shpnt)
scsi_cmd[5] = 0;
SCmd.request.dev = 0xffff; /* Mark not busy */
SCmd.cmd_len = 0;
scsi_do_cmd (&SCmd,
(void *) scsi_cmd, (void *)
......@@ -462,6 +465,7 @@ static void scan_scsis (struct Scsi_Host * shpnt)
scsi_cmd[5] = 0;
SCmd.request.dev = 0xffff; /* Mark not busy */
SCmd.cmd_len = 0;
scsi_do_cmd (&SCmd,
(void *) scsi_cmd, (void *)
......@@ -527,10 +531,6 @@ static void scsi_times_out (Scsi_Cmnd * SCpnt)
{
case NORMAL_TIMEOUT:
if (!in_scan_scsis) {
printk("scsi : aborting command due to timeout : pid %lu, scsi%d, id %d, lun %d ",
SCpnt->pid, SCpnt->host->host_no, (int) SCpnt->target, (int)
SCpnt->lun);
print_command (SCpnt->cmnd);
#ifdef DEBUG_TIMEOUT
scsi_dump_status();
#endif
......@@ -572,10 +572,10 @@ Scsi_Cmnd * request_queueable (struct request * req, Scsi_Device * device)
struct buffer_head * bh, *bhp;
if (!device)
panic ("No device passed to allocate_device().\n");
panic ("No device passed to request_queueable().\n");
if (req && req->dev <= 0)
panic("Invalid device in allocate_device");
panic("Invalid device in request_queueable");
SCpnt = device->host->host_queue;
while(SCpnt){
......@@ -629,6 +629,7 @@ Scsi_Cmnd * request_queueable (struct request * req, Scsi_Device * device)
SCpnt->old_use_sg = 0;
SCpnt->transfersize = 0;
SCpnt->underflow = 0;
SCpnt->cmd_len = 0;
return SCpnt;
}
......@@ -734,6 +735,7 @@ Scsi_Cmnd * allocate_device (struct request ** reqp, Scsi_Device * device,
SCpnt->use_sg = 0; /* Reset the scatter-gather flag */
SCpnt->old_use_sg = 0;
SCpnt->transfersize = 0; /* No default transfer size */
SCpnt->cmd_len = 0;
SCpnt->underflow = 0; /* Do not flag underflow conditions */
return SCpnt;
}
......@@ -832,8 +834,10 @@ static void scsi_request_sense (Scsi_Cmnd * SCpnt)
SCpnt->request_buffer = &SCpnt->sense_buffer;
SCpnt->request_bufflen = sizeof(SCpnt->sense_buffer);
SCpnt->use_sg = 0;
SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]);
internal_cmnd (SCpnt);
SCpnt->use_sg = SCpnt->old_use_sg;
SCpnt->cmd_len = SCpnt->old_cmd_len;
}
......@@ -891,6 +895,11 @@ void scsi_do_cmd (Scsi_Cmnd * SCpnt, const void *cmnd ,
(host->host_busy >= host->can_queue));
} else {
host->host_busy++;
if (host->block) {
struct Scsi_Host * block;
for(block = host->block; block != host; block = block->block)
block->host_busy |= ~SCSI_HOST_BLOCK;
}
sti();
break;
};
......@@ -924,6 +933,9 @@ void scsi_do_cmd (Scsi_Cmnd * SCpnt, const void *cmnd ,
SCpnt->request_buffer = buffer;
SCpnt->request_bufflen = bufflen;
SCpnt->old_use_sg = SCpnt->use_sg;
if (SCpnt->cmd_len == 0)
SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]);
SCpnt->old_cmd_len = SCpnt->cmd_len;
/* Start the timer ticking. */
......@@ -1329,6 +1341,7 @@ static void scsi_done (Scsi_Cmnd * SCpnt)
SCpnt->request_buffer = SCpnt->buffer;
SCpnt->request_bufflen = SCpnt->bufflen;
SCpnt->use_sg = SCpnt->old_use_sg;
SCpnt->cmd_len = SCpnt->old_cmd_len;
internal_cmnd (SCpnt);
};
break;
......@@ -1337,14 +1350,29 @@ static void scsi_done (Scsi_Cmnd * SCpnt)
}
if (status == FINISHED)
{
#ifdef DEBUG
printk("Calling done function - at address %08x\n", SCpnt->done);
#endif
{
#ifdef DEBUG
printk("Calling done function - at address %08x\n", SCpnt->done);
#endif
host->host_busy--; /* Indicate that we are free */
if (host->host_busy == 0 && host->block) {
struct Scsi_Host * block;
/*
* Now remove the locks for all of the related hosts.
*/
for(block = host->block; block != host; block = block->block)
block->host_busy &= ~SCSI_HOST_BLOCK;
/*
* Now wake them up. We do this in two separate stages to prevent
* race conditions.
*/
for(block = host->block; block != host; block = block->block)
wake_up(&block->host_wait);
}
wake_up(&host->host_wait);
SCpnt->result = result | ((exit & 0xff) << 24);
SCpnt->use_sg = SCpnt->old_use_sg;
SCpnt->cmd_len = SCpnt->old_cmd_len;
SCpnt->done (SCpnt);
}
......@@ -1403,6 +1431,10 @@ int scsi_abort (Scsi_Cmnd * SCpnt, int why)
update_timeout(SCpnt, oldto);
return 0;
}
printk("scsi : aborting command due to timeout : pid %lu, scsi%d, id %d, lun %d ",
SCpnt->pid, SCpnt->host->host_no, (int) SCpnt->target, (int)
SCpnt->lun);
print_command (SCpnt->cmnd);
SCpnt->abort_reason = why;
switch(host->hostt->abort(SCpnt)) {
/* We do not know how to abort. Try waiting another
......@@ -1787,6 +1819,8 @@ unsigned long scsi_dev_init (unsigned long memory_start,unsigned long memory_end
SCpnt->request.dev = -1; /* Mark not busy */
SCpnt->use_sg = 0;
SCpnt->old_use_sg = 0;
SCpnt->old_cmd_len = 0;
SCpnt->timeout = 0;
SCpnt->underflow = 0;
SCpnt->transfersize = 0;
SCpnt->host_scribble = NULL;
......
......@@ -428,6 +428,8 @@ typedef struct scsi_cmnd {
struct Scsi_Host * host;
Scsi_Device * device;
unsigned char target, lun;
unsigned char cmd_len;
unsigned char old_cmd_len;
struct scsi_cmnd *next, *prev;
/* These elements define the operation we are about to perform */
......
......@@ -7,7 +7,6 @@ int scsi_debug_command(Scsi_Cmnd *);
int scsi_debug_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int scsi_debug_abort(Scsi_Cmnd *);
int scsi_debug_biosparam(Disk *, int, int[]);
const char *scsi_debug_info(void);
int scsi_debug_reset(Scsi_Cmnd *);
#ifndef NULL
......@@ -16,8 +15,8 @@ int scsi_debug_reset(Scsi_Cmnd *);
#define SCSI_DEBUG_MAILBOXES 8
#define SCSI_DEBUG {NULL, "SCSI DEBUG", scsi_debug_detect, NULL, \
scsi_debug_info, scsi_debug_command, \
#define SCSI_DEBUG {NULL, NULL, "SCSI DEBUG", scsi_debug_detect, NULL, \
NULL, scsi_debug_command, \
scsi_debug_queuecommand, \
scsi_debug_abort, \
scsi_debug_reset, \
......
......@@ -33,12 +33,17 @@ static int ioctl_probe(struct Scsi_Host * host, void *buffer)
if ((temp = host->hostt->present) && buffer) {
len = get_fs_long ((unsigned long *) buffer);
string = host->hostt->info();
slen = strlen(string);
if (len > slen)
len = slen + 1;
verify_area(VERIFY_WRITE, buffer, len);
memcpy_tofs (buffer, string, len);
if(host->hostt->info)
string = host->hostt->info(host);
else
string = host->hostt->name;
if(string) {
slen = strlen(string);
if (len > slen)
len = slen + 1;
verify_area(VERIFY_WRITE, buffer, len);
memcpy_tofs (buffer, string, len);
}
}
return temp;
}
......
......@@ -838,6 +838,7 @@ static int sd_init_onedisk(int i)
cmd[1] = (rscsi_disks[i].device->lun << 5) & 0xe0;
memset ((void *) &cmd[2], 0, 8);
SCpnt->request.dev = 0xffff; /* Mark as really busy again */
SCpnt->cmd_len = 0;
SCpnt->sense_buffer[0] = 0;
SCpnt->sense_buffer[2] = 0;
......@@ -863,6 +864,7 @@ static int sd_init_onedisk(int i)
memset ((void *) &cmd[2], 0, 8);
cmd[4] = 1; /* Start spin cycle */
SCpnt->request.dev = 0xffff; /* Mark as really busy again */
SCpnt->cmd_len = 0;
SCpnt->sense_buffer[0] = 0;
SCpnt->sense_buffer[2] = 0;
......@@ -897,6 +899,7 @@ static int sd_init_onedisk(int i)
memset ((void *) &cmd[2], 0, 8);
memset ((void *) buffer, 0, 8);
SCpnt->request.dev = 0xffff; /* Mark as really busy again */
SCpnt->cmd_len = 0;
SCpnt->sense_buffer[0] = 0;
SCpnt->sense_buffer[2] = 0;
......
......@@ -39,6 +39,7 @@ typedef struct scsi_disk {
unsigned char sector_bit_shift; /* power of 2 sectors per FS block */
unsigned ten:1; /* support ten byte read / write */
unsigned remap:1; /* support remapping */
unsigned has_part_table:1; /* has partition table */
} Scsi_Disk;
extern Scsi_Disk * rscsi_disks;
......
......@@ -362,7 +362,7 @@ int seagate_st0x_detect (Scsi_Host_Template * tpnt)
}
}
const char *seagate_st0x_info(void) {
const char *seagate_st0x_info(struct Scsi_Host * shpnt) {
static char buffer[256];
sprintf(buffer, "scsi%d : %s at irq %d address %p options :"
#ifdef ARBITRATE
......@@ -525,7 +525,7 @@ int seagate_st0x_queue_command (Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
* Set linked command bit in control field of SCSI command.
*/
current_cmnd[COMMAND_SIZE(current_cmnd[0])] |= 0x01;
current_cmnd[SCpnt->cmd_len] |= 0x01;
if (linked_connected) {
#if (DEBUG & DEBUG_LINKED)
printk("scsi%d : using linked commands, current I_T_L nexus is ",
......
......@@ -17,7 +17,7 @@ int seagate_st0x_command(Scsi_Cmnd *);
int seagate_st0x_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int seagate_st0x_abort(Scsi_Cmnd *);
const char *seagate_st0x_info(void);
const char *seagate_st0x_info(struct Scsi_Host *);
int seagate_st0x_reset(Scsi_Cmnd *);
#ifndef NULL
......@@ -26,7 +26,7 @@ int seagate_st0x_reset(Scsi_Cmnd *);
int seagate_st0x_biosparam(Disk *, int, int*);
#define SEAGATE_ST0X {NULL, "Seagate ST-01/ST-02", seagate_st0x_detect, \
#define SEAGATE_ST0X {NULL, NULL, NULL, seagate_st0x_detect, \
NULL, \
seagate_st0x_info, seagate_st0x_command, \
seagate_st0x_queue_command, seagate_st0x_abort, \
......
......@@ -220,6 +220,7 @@ static int sg_write(struct inode *inode,struct file *filp,char *buf,int count)
int dev=MINOR(inode->i_rdev);
Scsi_Cmnd *SCpnt;
int bsize,size,amt,i;
unsigned char opcode;
unsigned char cmnd[MAX_COMMAND_SIZE];
struct scsi_generic *device=&scsi_generics[dev];
......@@ -274,6 +275,9 @@ static int sg_write(struct inode *inode,struct file *filp,char *buf,int count)
SCpnt->request.dev=dev;
SCpnt->sense_buffer[0]=0;
size=COMMAND_SIZE(get_fs_byte(buf));
size=COMMAND_SIZE(opcode);
if (opcode >= 0xc0 && device->header.twelve_byte) size = 12;
SCpnt->cmd_len = size;
memcpy_fromfs(cmnd,buf,size);
buf+=size;
memcpy_fromfs(device->buff,buf,device->header.pack_len-size-sizeof(struct sg_header));
......
......@@ -17,7 +17,8 @@ struct sg_header
int reply_len; /* maximum length <4096 of expected reply */
int pack_id; /* id number of packet */
int result; /* 0==ok, otherwise refer to errno codes */
int flags; /* for future use */
unsigned int twelve_byte:1; /* Force 12 byte command length for group 6 & 7 commands */
unsigned int other_flags:31; /* for future use */
unsigned char sense_buffer[16]; /* used only by reads */
/* command follows then data for command */
};
......
......@@ -325,9 +325,11 @@ static void sr_photocd(struct inode *inode)
sec = (unsigned long)buffer[16]/16*10 + (unsigned long)buffer[16]%16;
frame = (unsigned long)buffer[17]/16*10 + (unsigned long)buffer[17]%16;
sector = min*60*75 + sec*75 + frame;
sector-=CD_BLOCK_OFFSET;
if (sector) {
printk("sr_photocd: multisession PhotoCD detected\n"); }}
sector -= CD_BLOCK_OFFSET;
printk("sr_photocd: multisession PhotoCD detected\n");
}
}
scsi_free(buffer,512);
SCpnt->request.dev = -1;
break;
......@@ -374,9 +376,11 @@ static void sr_photocd(struct inode *inode)
sec = (unsigned long)buffer[2]/16*10 + (unsigned long)buffer[2]%16;
frame = (unsigned long)buffer[3]/16*10 + (unsigned long)buffer[3]%16;
sector = min*60*75 + sec*75 + frame;
sector-=CD_BLOCK_OFFSET;
if (sector) {
printk("sr_photocd: multisession PhotoCD detected: %lu\n",sector); }}
sector -= CD_BLOCK_OFFSET;
printk("sr_photocd: multisession PhotoCD detected: %lu\n",sector);
}
}
scsi_free(buffer,512);
SCpnt->request.dev = -1;
break;
......@@ -826,10 +830,11 @@ static void sr_init_done (Scsi_Cmnd * SCpnt)
static void get_sectorsize(int i){
unsigned char cmd[10];
unsigned char buffer[513];
unsigned char *buffer;
int the_result, retries;
Scsi_Cmnd * SCpnt;
buffer = (unsigned char *) scsi_malloc(512);
SCpnt = allocate_device(NULL, scsi_CDs[i].device, 1);
retries = 3;
......@@ -838,6 +843,7 @@ static void get_sectorsize(int i){
cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0;
memset ((void *) &cmd[2], 0, 8);
SCpnt->request.dev = 0xffff; /* Mark as really busy */
SCpnt->cmd_len = 0;
memset(buffer, 0, 8);
......@@ -887,6 +893,7 @@ static void get_sectorsize(int i){
scsi_CDs[i].capacity *= 4;
scsi_CDs[i].needs_sector_size = 0;
};
scsi_free(buffer, 512);
}
static void sr_init()
......
......@@ -385,17 +385,4 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src
return 0;
}
/*
* Function : const char *t128_info(void)
*
* Purpose : provide further information about this driver.
*
* Returns : an empty string.
*/
const char *t128_info (void) {
static const char string[]="";
return string;
}
#include "NCR5380.c"
......@@ -94,7 +94,6 @@
int t128_abort(Scsi_Cmnd *);
int t128_biosparam(Disk *, int, int*);
int t128_detect(Scsi_Host_Template *);
const char *t128_info(void);
int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int t128_reset(Scsi_Cmnd *);
......@@ -118,8 +117,8 @@ int t128_reset(Scsi_Cmnd *);
#ifdef HOSTS_C
#define TRANTOR_T128 {NULL, "Trantor T128/T128F/T228", t128_detect, NULL, \
t128_info, \
#define TRANTOR_T128 {NULL, NULL, "Trantor T128/T128F/T228", t128_detect, NULL, \
NULL, \
NULL, t128_queue_command, t128_abort, t128_reset, NULL, \
t128_biosparam, \
/* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \
......
......@@ -416,10 +416,6 @@ int u14_34f_detect (Scsi_Host_Template * tpnt) {
return j;
}
const char *u14_34f_info(void) {
return driver_name;
}
static inline void build_sg_list(struct mscp *cpp, Scsi_Cmnd *SCpnt) {
unsigned int k, data_len = 0;
struct scatterlist * sgpnt;
......@@ -506,7 +502,7 @@ int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
cpp->data_len = SCpnt->request_bufflen;
}
cpp->scsi_cdbs_len = COMMAND_SIZE(*(unsigned char *)SCpnt->cmnd);
cpp->scsi_cdbs_len = SCpnt->cmd_len;
memcpy(cpp->scsi_cdbs, SCpnt->cmnd, cpp->scsi_cdbs_len);
if (wait_on_busy(sh[j]->io_port)) {
......
......@@ -5,7 +5,6 @@
#define _U14_34F_H
int u14_34f_detect(Scsi_Host_Template *);
const char *u14_34f_info(void);
int u14_34f_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int u14_34f_abort(Scsi_Cmnd *);
int u14_34f_reset(Scsi_Cmnd *);
......@@ -14,12 +13,13 @@ int u14_34f_biosparam(Disk *, int, int *);
#define U14_34F_VERSION "1.10.01"
#define ULTRASTOR_14_34F { \
NULL, \
NULL, \
"UltraStor 14F/34F rev. " U14_34F_VERSION " by " \
"Dario_Ballabio@milano.europe.dg.com.",\
u14_34f_detect, \
NULL, \
u14_34f_info, \
NULL, \
NULL, \
u14_34f_queuecommand, \
u14_34f_abort, \
......
......@@ -620,7 +620,7 @@ int ultrastor_detect(Scsi_Host_Template * tpnt)
return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
}
const char *ultrastor_info(void)
const char *ultrastor_info(struct Scsi_Host * shpnt)
{
static char buf[64];
......@@ -714,7 +714,7 @@ int ultrastor_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
my_mscp->command_link = 0; /*???*/
my_mscp->scsi_command_link_id = 0; /*???*/
my_mscp->length_of_sense_byte = sizeof SCpnt->sense_buffer;
my_mscp->length_of_scsi_cdbs = COMMAND_SIZE(*(unsigned char *)SCpnt->cmnd);
my_mscp->length_of_scsi_cdbs = SCpnt->cmd_len;
memcpy(my_mscp->scsi_cdbs, SCpnt->cmnd, my_mscp->length_of_scsi_cdbs);
my_mscp->adapter_status = 0;
my_mscp->target_status = 0;
......
......@@ -14,7 +14,7 @@
#define _ULTRASTOR_H
int ultrastor_detect(Scsi_Host_Template *);
const char *ultrastor_info(void);
const char *ultrastor_info(struct Scsi_Host * shpnt);
int ultrastor_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int ultrastor_abort(Scsi_Cmnd *);
int ultrastor_reset(Scsi_Cmnd *);
......@@ -29,8 +29,8 @@ int ultrastor_biosparam(Disk *, int, int *);
#define ULTRASTOR_24F_PORT 0xC80
#define ULTRASTOR_14F { NULL, /* Ptr for modules*/ \
"UltraStor 14F/24F/34F", \
#define ULTRASTOR_14F { NULL, NULL, /* Ptr for modules*/ \
NULL, \
ultrastor_detect, \
NULL, /* Release */ \
ultrastor_info, \
......
......@@ -900,7 +900,7 @@ int wd7000_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
register short cdblen;
Adapter *host = (Adapter *) SCpnt->host->hostdata;
cdblen = COMMAND_SIZE(cdb[0]);
cdblen = SCpnt->cmd_len;
idlun = ((SCpnt->target << 5) & 0xe0) | (SCpnt->lun & 7);
SCpnt->scsi_done = done;
SCpnt->SCp.phase = 1;
......@@ -1206,18 +1206,6 @@ int wd7000_reset(Scsi_Cmnd * SCpnt)
}
/*
* The info routine in the WD7000 structure isn't per-adapter, so it can't
* really return any useful information about an adapter. Because of this,
* I'm no longer using it to return rev. level.
*/
const char *wd7000_info(void)
{
static char info[] = "Western Digital WD-7000";
return info;
}
/*
* This was borrowed directly from aha1542.c, but my disks are organized
* this way, so I think it will work OK. Someone who is ambitious can
......
......@@ -16,7 +16,6 @@ int wd7000_detect(Scsi_Host_Template *);
int wd7000_command(Scsi_Cmnd *);
int wd7000_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int wd7000_abort(Scsi_Cmnd *);
const char *wd7000_info(void);
int wd7000_reset(Scsi_Cmnd *);
int wd7000_biosparam(Disk *, int, int*);
......@@ -38,11 +37,11 @@ int wd7000_biosparam(Disk *, int, int*);
#define WD7000_Q 16
#define WD7000_SG 16
#define WD7000 { NULL, \
#define WD7000 { NULL, NULL, \
"Western Digital WD-7000", \
wd7000_detect, \
NULL, \
wd7000_info, \
NULL, \
wd7000_command, \
wd7000_queuecommand, \
wd7000_abort, \
......
......@@ -186,7 +186,7 @@ int locks_deadlocked(int my_pid,int blocked_pid)
if (ret_val) return -EDEADLOCK;
}
dlock_wait = dlock_wait->next;
} while (dlock_wait != fl->fl_wait);
} while (dlock_wait != NULL);
}
return 0;
}
......
......@@ -12,7 +12,7 @@
* make sure SET_PROCTITLE works. Also removed
* bad '!' which forced address recalculation for
* EVERY character on the current page.
* <middelin@calvin.iaf.nl>
* <middelin@polyware.iaf.nl>
*/
#include <linux/types.h>
......
......@@ -25,9 +25,10 @@ int umsdos_readdir_kmem(
int count)
{
int ret;
int old_fs = get_fs();
set_fs (KERNEL_DS);
ret = msdos_readdir(inode,filp,dirent,count);
set_fs (USER_DS);
set_fs (old_fs);
return ret;
}
/*
......@@ -39,10 +40,11 @@ int umsdos_file_read_kmem(
char *buf,
int count)
{
int ret;
int ret;
int old_fs = get_fs();
set_fs (KERNEL_DS);
ret = msdos_file_read(inode,filp,buf,count);
set_fs (USER_DS);
set_fs (old_fs);
return ret;
}
/*
......@@ -55,9 +57,10 @@ int umsdos_file_write_kmem(
int count)
{
int ret;
int old_fs = get_fs();
set_fs (KERNEL_DS);
ret = msdos_file_write(inode,filp,buf,count);
set_fs (USER_DS);
set_fs (old_fs);
return ret;
}
......@@ -208,7 +211,7 @@ int umsdos_writeentry (
return ret;
}
#define CHUNK_SIZE (16*UMSDOS_REC_SIZE)
#define CHUNK_SIZE (8*UMSDOS_REC_SIZE)
struct find_buffer{
char buffer[CHUNK_SIZE];
int pos; /* read offset in buffer */
......
......@@ -69,6 +69,9 @@
#define MAX_DMA_CHANNELS 8
/* The maximum address that we can perform a DMA transfer to on this platform */
#define MAX_DMA_ADDRESS 0xffffff
/* 8237 DMA controllers */
#define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */
#define IO_DMA2_BASE 0xC0 /* 16 bit master DMA, ch 4(=slave input)..7 */
......
......@@ -42,11 +42,14 @@
#ifndef _LINUX_INET_H
#define _LINUX_INET_H
#ifdef __i386__
#if defined(__i386__)
#define NET16(x) ((((x) >> 8) & 0x00FF) | (((x) << 8) & 0xFF00))
#endif
#ifdef __mc680x0__
#elif defined(__mc68000__)
#define NET16(x) (x)
#elif defined(__alpha__)
#define NET16(x) ((((x) >> 8) & 0x00FF) | (((x) << 8) & 0xFF00))
#else
#error change this to match your machine
#endif
#ifdef __KERNEL__
......
......@@ -14,10 +14,12 @@
/*
* Call check_region() before probing for your hardware.
* Once you have found you hardware, register it with snarf_region().
* If you unload the driver, use release_region to free ports.
*/
extern void reserve_setup(char *str, int *ints);
extern int check_region(unsigned int from, unsigned int extent);
extern void snarf_region(unsigned int from, unsigned int extent);
extern void release_region(unsigned int from, unsigned int extent);
#define HAVE_AUTOIRQ
......
......@@ -35,7 +35,7 @@ struct timestamp {
#if defined(__i386__)
u8 flags:4,
overflow:4;
#elif defined(__mc680x0__)
#elif defined(__mc68000__)
u8 overflow:4,
flags:4;
#elif defined(__alpha__)
......@@ -76,7 +76,7 @@ struct iphdr {
#if defined(__i386__)
u8 ihl:4,
version:4;
#elif defined (__mc680x0__)
#elif defined (__mc68000__)
u8 version:4,
ihl:4;
#elif defined (__alpha__)
......
......@@ -234,6 +234,11 @@ extern unsigned short * mem_map;
#define GFP_NOBUFFER 0x04
#define GFP_NFS 0x05
/* Flag - indicates that the buffer will be suitable for DMA. Ignored on some
platforms, used as appropriate on others */
#define GFP_DMA 0x80
/*
* vm_ops not present page codes for shared memory.
*
......
......@@ -37,7 +37,7 @@ struct tcphdr {
ack:1,
urg:1,
res2:2;
#elif defined(__mc680x0__)
#elif defined(__mc68000__)
u16 res2:2,
urg:1,
ack:1,
......
......@@ -92,6 +92,7 @@ extern void t128_setup(char *str, int *ints);
extern void pas16_setup(char *str, int *ints);
extern void generic_NCR5380_setup(char *str, int *intr);
extern void aha152x_setup(char *str, int *ints);
extern void aha1542_setup(char *str, int *ints);
extern void aha274x_setup(char *str, int *ints);
extern void scsi_luns_setup(char *str, int *ints);
extern void sound_setup(char *str, int *ints);
......@@ -211,6 +212,9 @@ struct {
#ifdef CONFIG_SCSI_AHA152X
{ "aha152x=", aha152x_setup},
#endif
#ifdef CONFIG_SCSI_AHA1542
{ "aha1542=", aha1542_setup},
#endif
#ifdef CONFIG_SCSI_AHA274X
{ "aha274x=", aha274x_setup},
#endif
......
......@@ -165,6 +165,16 @@ void snarf_region(unsigned int from, unsigned int num)
return;
}
void release_region(unsigned int from, unsigned int num)
{
if (from > IO_BITMAP_SIZE*32)
return;
if (from + num > IO_BITMAP_SIZE*32)
num = IO_BITMAP_SIZE*32 - from;
set_bitmap(ioport_registrar, from, num, 0);
return;
}
int check_region(unsigned int from, unsigned int num)
{
if (from > IO_BITMAP_SIZE*32)
......
3c509.o de600.o de620.o 3c501.o plip.o 8390.o
3c509.o de600.o de620.o 3c501.o eexpress.o plip.o 8390.o
......@@ -17,7 +17,7 @@
* Fixes:
* Alan Cox : UDP sockets show the rxqueue/txqueue
* using hint flag for the netinfo.
* Pauline Middelink : Pidentd support
* Pauline Middelink : identd support
* Alan Cox : Make /proc safer.
* Erik Schoenfelder : /proc/net/snmp
* Alan Cox : Handle dead sockets properly.
......
......@@ -46,7 +46,7 @@
* Alan Cox : Added RCVBUF,SNDBUF size setting. It suddenly occurred to me how easy it was so...
* Rick Sladkey : Relaxed UDP rules for matching packets.
* C.E.Hawkins : IFF_PROMISC/SIOCGHWADDR support
* Pauline Middelink : Pidentd support
* Pauline Middelink : identd support
* Alan Cox : Fixed connect() taking signals I think.
* Alan Cox : SO_LINGER supported
* Alan Cox : Error reporting fixes
......
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