Commit fb3ed0dc authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.68

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