cregit-Linux how code gets into the kernel

Release 4.14 drivers/scsi/eata_generic.h

Directory: drivers/scsi
/* SPDX-License-Identifier: GPL-2.0 */
/********************************************************
* Header file for eata_dma.c and eata_pio.c             *
* Linux EATA SCSI drivers                               *
* (c) 1993-96 Michael Neuffer                           *
*             mike@i-Connect.Net                        *
*             neuffer@mail.uni-mainz.de                 *
*********************************************************
* last change: 96/08/14                                 *
********************************************************/


#ifndef _EATA_GENERIC_H

#define _EATA_GENERIC_H



/*********************************************
 * Misc. definitions                         *
 *********************************************/


#define R_LIMIT 0x20000


#define MAXISA	   4

#define MAXEISA	  16  

#define MAXPCI	  16

#define MAXIRQ	  16 

#define MAXTARGET 16

#define MAXCHANNEL 3


#define IS_ISA	   'I'

#define IS_EISA	   'E'

#define IS_PCI	   'P'


#define BROKEN_INQUIRY	1


#define BUSMASTER       0xff

#define PIO             0xfe


#define EATA_SIGNATURE	0x45415441     
/* BIG ENDIAN coded "EATA" sig.  */


#define DPT_ID1         0x12

#define DPT_ID2         0x14


#define ATT_ID1         0x06

#define ATT_ID2         0x94

#define ATT_ID3         0x0


#define NEC_ID1         0x38

#define NEC_ID2         0xa3

#define NEC_ID3         0x82

 

#define EATA_CP_SIZE	 44


#define MAX_PCI_DEVICES  32	       
/* Maximum # Of Devices Per Bus  */

#define MAX_METHOD_2	 16	       
/* Max Devices For Method 2      */

#define MAX_PCI_BUS	 16	       
/* Maximum # Of Busses Allowed   */


#define SG_SIZE		 64 

#define SG_SIZE_BIG	 252	       
/* max. 8096 elements, 64k */


#define UPPER_DEVICE_QUEUE_LIMIT 64    
/* The limit we have to set for the 
                                        * device queue to keep the broken 
                                        * midlevel SCSI code from producing
                                        * bogus timeouts
                                        */


#define TYPE_DISK_QUEUE  16

#define TYPE_TAPE_QUEUE  4

#define TYPE_ROM_QUEUE   4

#define TYPE_OTHER_QUEUE 2


#define FREE	         0

#define OK	         0

#define NO_TIMEOUT       0

#define USED	         1

#define TIMEOUT	         2

#define RESET	         4

#define LOCKED	         8

#define ABORTED          16


#define READ             0

#define WRITE            1

#define OTHER            2


#define HD(cmd)	 ((hostdata *)&(cmd->device->host->hostdata))

#define CD(cmd)	 ((struct eata_ccb *)(cmd->host_scribble))

#define SD(host) ((hostdata *)&(host->hostdata))

/***********************************************
 *    EATA Command & Register definitions      *
 ***********************************************/

#define PCI_REG_DPTconfig	 0x40	 

#define PCI_REG_PumpModeAddress	 0x44	 

#define PCI_REG_PumpModeData	 0x48	 

#define PCI_REG_ConfigParam1	 0x50	 

#define PCI_REG_ConfigParam2	 0x54	 



#define EATA_CMD_PIO_SETUPTEST	 0xc6

#define EATA_CMD_PIO_READ_CONFIG 0xf0

#define EATA_CMD_PIO_SET_CONFIG	 0xf1

#define EATA_CMD_PIO_SEND_CP	 0xf2

#define EATA_CMD_PIO_RECEIVE_SP	 0xf3

#define EATA_CMD_PIO_TRUNC	 0xf4


#define EATA_CMD_RESET		 0xf9

#define EATA_CMD_IMMEDIATE	 0xfa


#define EATA_CMD_DMA_READ_CONFIG 0xfd

#define EATA_CMD_DMA_SET_CONFIG	 0xfe

#define EATA_CMD_DMA_SEND_CP	 0xff


#define ECS_EMULATE_SENSE	 0xd4


#define EATA_GENERIC_ABORT       0x00 

#define EATA_SPECIFIC_RESET      0x01

#define EATA_BUS_RESET           0x02

#define EATA_SPECIFIC_ABORT      0x03

#define EATA_QUIET_INTR          0x04

#define EATA_COLD_BOOT_HBA       0x06	   
/* Only as a last resort        */

#define EATA_FORCE_IO            0x07


#define HA_CTRLREG     0x206       
/* control register for HBA    */

#define HA_CTRL_DISINT 0x02        
/* CTRLREG: disable interrupts */

#define HA_CTRL_RESCPU 0x04        
/* CTRLREG: reset processor    */

#define HA_CTRL_8HEADS 0x08        
/* CTRLREG: set for drives with* 
                                    * >=8 heads (WD1003 rudimentary :-) */


#define HA_WCOMMAND    0x07	   
/* command register offset      */

#define HA_WIFC        0x06	   
/* immediate command offset  */

#define HA_WCODE       0x05 

#define HA_WCODE2      0x04 

#define HA_WDMAADDR    0x02	   
/* DMA address LSB offset       */  

#define HA_RAUXSTAT    0x08	   
/* aux status register offset*/

#define HA_RSTATUS     0x07	   
/* status register offset       */

#define HA_RDATA       0x00	   
/* data register (16bit)        */

#define HA_WDATA       0x00	   
/* data register (16bit)        */


#define HA_ABUSY       0x01	   
/* aux busy bit         */

#define HA_AIRQ	       0x02	   
/* aux IRQ pending bit  */

#define HA_SERROR      0x01	   
/* pr. command ended in error*/

#define HA_SMORE       0x02	   
/* more data soon to come       */

#define HA_SCORR       0x04	   
/* data corrected               */

#define HA_SDRQ	       0x08	   
/* data request active  */

#define HA_SSC	       0x10	   
/* seek complete                */

#define HA_SFAULT      0x20	   
/* write fault          */

#define HA_SREADY      0x40	   
/* drive ready          */

#define HA_SBUSY       0x80	   
/* drive busy           */

#define HA_SDRDY       HA_SSC+HA_SREADY+HA_SDRQ 

/**********************************************
 * Message definitions                        *
 **********************************************/


#define HA_NO_ERROR	 0x00	
/* No Error                             */

#define HA_ERR_SEL_TO	 0x01	
/* Selection Timeout                    */

#define HA_ERR_CMD_TO	 0x02	
/* Command Timeout                      */

#define HA_BUS_RESET	 0x03	
/* SCSI Bus Reset Received              */

#define HA_INIT_POWERUP	 0x04	
/* Initial Controller Power-up          */

#define HA_UNX_BUSPHASE	 0x05	
/* Unexpected Bus Phase                 */

#define HA_UNX_BUS_FREE	 0x06	
/* Unexpected Bus Free                  */

#define HA_BUS_PARITY	 0x07	
/* Bus Parity Error                     */

#define HA_SCSI_HUNG	 0x08	
/* SCSI Hung                            */

#define HA_UNX_MSGRJCT	 0x09	
/* Unexpected Message Rejected          */

#define HA_RESET_STUCK	 0x0a	
/* SCSI Bus Reset Stuck                 */

#define HA_RSENSE_FAIL	 0x0b	
/* Auto Request-Sense Failed            */

#define HA_PARITY_ERR	 0x0c	
/* Controller Ram Parity Error          */

#define HA_CP_ABORT_NA	 0x0d	
/* Abort Message sent to non-active cmd */

#define HA_CP_ABORTED	 0x0e	
/* Abort Message sent to active cmd     */

#define HA_CP_RESET_NA	 0x0f	
/* Reset Message sent to non-active cmd */

#define HA_CP_RESET	 0x10	
/* Reset Message sent to active cmd     */

#define HA_ECC_ERR	 0x11	
/* Controller Ram ECC Error             */

#define HA_PCI_PARITY	 0x12	
/* PCI Parity Error                     */

#define HA_PCI_MABORT	 0x13	
/* PCI Master Abort                     */

#define HA_PCI_TABORT	 0x14	
/* PCI Target Abort                     */

#define HA_PCI_STABORT	 0x15	
/* PCI Signaled Target Abort            */

/**********************************************
 *  Other  definitions                        *
 **********************************************/


struct reg_bit {      /* reading this one will clear the interrupt    */
    
__u8 error:1;     /* previous command ended in an error         */
    
__u8 more:1;      /* more DATA coming soon, poll BSY & DRQ (PIO)  */
    
__u8 corr:1;      /* data read was successfully corrected with ECC*/
    
__u8 drq:1;	      /* data request active  */     
    
__u8 sc:1;	      /* seek complete              */
    
__u8 fault:1;     /* write fault        */
    
__u8 ready:1;     /* drive ready        */
    
__u8 busy:1;      /* controller busy      */
};


struct reg_abit {     /* reading this won't clear the interrupt */
    
__u8 abusy:1;     /* auxiliary busy                               */
    
__u8 irq:1;	      /* set when drive interrupt is asserted */
    
__u8 dummy:6;
};


struct eata_register {	    /* EATA register set */
    
__u8 data_reg[2];	    /* R, couldn't figure this one out              */
    
__u8 cp_addr[4];	    /* W, CP address register                       */
    union { 
	
__u8 command;	    /* W, command code: [read|set] conf, send CP*/
	
struct reg_bit status;	/* R, see register_bit1                 */
	
__u8 statusbyte;
    
} ovr;   
    
struct reg_abit aux_stat; /* R, see register_bit2                 */
};


struct get_conf {	      /* Read Configuration Array             */
    
__u32  len;		      /* Should return 0x22, 0x24, etc                */
    
__u32 signature;	      /* Signature MUST be "EATA"             */
    
__u8    version2:4,
	     
version:4;	      /* EATA Version level                   */
    
__u8 OCS_enabled:1,	      /* Overlap Command Support enabled      */
	 
TAR_support:1,	      /* SCSI Target Mode supported           */
	      
TRNXFR:1,	      /* Truncate Transfer Cmd not necessary  *
                               * Only used in PIO Mode                  */
	
MORE_support:1,	      /* MORE supported (only PIO Mode)               */
	 
DMA_support:1,	      /* DMA supported Driver uses only               *
                               * this mode                              */
	   
DMA_valid:1,	      /* DRQ value in Byte 30 is valid                */
		 
ATA:1,	      /* ATA device connected (not supported) */
	   
HAA_valid:1;	      /* Hostadapter Address is valid         */

    
__u16 cppadlen;	      /* Number of pad bytes send after CD data *
                               * set to zero for DMA commands           */
    
__u8 scsi_id[4];	      /* SCSI ID of controller 2-0 Byte 0 res.        *
                               * if not, zero is returned               */
    
__u32  cplen;	      /* CP length: number of valid cp bytes  */
    
__u32  splen;	      /* Number of bytes returned after               * 
                               * Receive SP command                     */
    
__u16 queuesiz;	      /* max number of queueable CPs          */
    
__u16 dummy;
    
__u16 SGsiz;	      /* max number of SG table entries               */
    
__u8    IRQ:4,	      /* IRQ used this HA                     */
	 
IRQ_TR:1,	      /* IRQ Trigger: 0=edge, 1=level         */
	 
SECOND:1,	      /* This is a secondary controller               */
    
DMA_channel:2;	      /* DRQ index, DRQ is 2comp of DRQX      */
    
__u8 sync;		      /* device at ID 7 tru 0 is running in   *
                               * synchronous mode, this will disappear  */
    
__u8   DSBLE:1,	      /* ISA i/o addressing is disabled               */
	 
FORCADR:1,	      /* i/o address has been forced          */
	  
SG_64K:1,
	  
SG_UAE:1,
		:4;
    
__u8  MAX_ID:5,	      /* Max number of SCSI target IDs                */
	
MAX_CHAN:3;	      /* Number of SCSI busses on HBA         */
    
__u8 MAX_LUN;	      /* Max number of LUNs                   */
    
__u8	:3,
	 
AUTOTRM:1,
	 
M1_inst:1,
	 
ID_qest:1,	      /* Raidnum ID is questionable           */
	  
is_PCI:1,	      /* HBA is PCI                           */
	 
is_EISA:1;	      /* HBA is EISA                          */
    
__u8 RAIDNUM;             /* unique HBA identifier                  */
    
__u8 unused[474]; 
};


struct eata_sg_list
{
    
__u32 data;
    
__u32 len;
};


struct eata_ccb {	      /* Send Command Packet structure            */
 
    
__u8 SCSI_Reset:1,	      /* Cause a SCSI Bus reset on the cmd    */
	   
HBA_Init:1,	      /* Cause Controller to reinitialize     */
       
Auto_Req_Sen:1,	      /* Do Auto Request Sense on errors      */
	    
scatter:1,	      /* Data Ptr points to a SG Packet               */
	     
Resrvd:1,	      /* RFU                                  */
	  
Interpret:1,	      /* Interpret the SCSI cdb of own use    */
	    
DataOut:1,	      /* Data Out phase with command          */
	     
DataIn:1;	      /* Data In phase with command           */
    
__u8 reqlen;	      /* Request Sense Length                 * 
                               * Valid if Auto_Req_Sen=1                */
    
__u8 unused[3];
    
__u8  FWNEST:1,	      /* send cmd to phys RAID component      */
	 
unused2:7;
    
__u8 Phsunit:1,	      /* physical unit on mirrored pair               */
	    
I_AT:1,	      /* inhibit address translation          */
	 
I_HBA_C:1,	      /* HBA inhibit caching                  */
	 
unused3:5;

    
__u8     cp_id:5,	      /* SCSI Device ID of target             */ 
	
cp_channel:3;	      /* SCSI Channel # of HBA                        */
    
__u8    cp_lun:3,
		  :2,
	 
cp_luntar:1,	      /* CP is for target ROUTINE             */
	 
cp_dispri:1,	      /* Grant disconnect privilege           */
       
cp_identify:1;	      /* Always TRUE                          */
    
__u8 cp_msg1;	      /* Message bytes 0-3                    */
    
__u8 cp_msg2;
    
__u8 cp_msg3;
    
__u8 cp_cdb[12];	      /* Command Descriptor Block             */
    
__u32 cp_datalen;	      /* Data Transfer Length                 *
                               * If scatter=1 len of sg package         */
    
void *cp_viraddr;	      /* address of this ccb                  */
    
__u32 cp_dataDMA;	      /* Data Address, if scatter=1           *
                               * address of scatter packet              */
    
__u32 cp_statDMA;	      /* address for Status Packet            */ 
    
__u32 cp_reqDMA;	      /* Request Sense Address, used if               *
                               * CP command ends with error             */
    /* Additional CP info begins here */
    
__u32 timestamp;	      /* Needed to measure command latency    */
    
__u32 timeout;
    
__u8 sizeindex;
    
__u8 rw_latency;
    
__u8 retries;
    
__u8 status;	      /* status of this queueslot             */
    
struct scsi_cmnd *cmd;    /* address of cmd                               */
    
struct eata_sg_list *sg_list;
};



struct eata_sp {
    
__u8 hba_stat:7,	      /* HBA status                           */
	      
EOC:1;	      /* True if command finished             */
    
__u8 scsi_stat;	      /* Target SCSI status                   */
    
__u8 reserved[2];
    
__u32  residue_len;	      /* Number of bytes not transferred      */
    
struct eata_ccb *ccb;     /* Address set in COMMAND PACKET                */
    
__u8 msg[12];
};


typedef struct hstd {
    
__u8   vendor[9];
    
__u8   name[18];
    
__u8   revision[6];
    
__u8   EATA_revision;
    
__u32  firmware_revision;
    
__u8   HBA_number;
    
__u8   bustype;		 /* bustype of HBA              */
    
__u8   channel;		 /* # of avail. scsi channels  */
    
__u8   state;		 /* state of HBA        */
    
__u8   primary;		 /* true if primary             */
    
__u8        more_support:1,  /* HBA supports MORE flag     */
           
immediate_support:1,  /* HBA supports IMMEDIATE CMDs*/
              
broken_INQUIRY:1;	 /* This is an EISA HBA with   *
                                  * broken INQUIRY             */
    
__u8   do_latency;		 /* Latency measurement flag   */
    
__u32  reads[13];
    
__u32  writes[13];
    
__u32  reads_lat[12][4];
    
__u32  writes_lat[12][4];
    
__u32  all_lat[4];
    
__u8   resetlevel[MAXCHANNEL]; 
    
__u32  last_ccb;		 /* Last used ccb               */
    
__u32  cplen;		 /* size of CP in words         */
    
__u16  cppadlen;		 /* pad length of cp in words  */
    
__u16  queuesize;
    
__u16  sgsize;               /* # of entries in the SG list*/
    
__u16  devflags;		 /* bits set for detected devices */
    
__u8   hostid;		 /* SCSI ID of HBA              */
    
__u8   moresupport;		 /* HBA supports MORE flag     */
    
struct Scsi_Host *next;	    
    
struct Scsi_Host *prev;
    
struct pci_dev *pdev;	/* PCI device or NULL for non PCI */
    
struct eata_sp sp;		 /* status packet               */ 
    
struct eata_ccb ccb[0];	 /* ccb array begins here      */

}hostdata;

/* structure for max. 2 emulated drives */

struct drive_geom_emul {
    
__u8  trans;		 /* translation flag 1=transl */
    
__u8  channel;		 /* SCSI channel number        */
    
__u8  HBA;			 /* HBA number (prim/sec)     */
    
__u8  id;			 /* drive id                   */
    
__u8  lun;			 /* drive lun                  */
    
__u32 heads;		 /* number of heads            */
    
__u32 sectors;		 /* number of sectors          */
    
__u32 cylinder;		 /* number of cylinders        */
};


struct geom_emul {
    
__u8 bios_drives;		 /* number of emulated drives */
    
struct drive_geom_emul drv[2]; /* drive structures           */
};

#endif /* _EATA_GENERIC_H */

/*
 * Overrides for Emacs so that we almost follow Linus's tabbing style.
 * Emacs will notice this stuff at the end of the file and automatically
 * adjust the settings for this buffer only.  This must remain at the end
 * of the file.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-indent-level: 4
 * c-brace-imaginary-offset: 0
 * c-brace-offset: -4
 * c-argdecl-indent: 4
 * c-label-offset: -4
 * c-continued-statement-offset: 4
 * c-continued-brace-offset: 0
 * tab-width: 8
 * End:
 */

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)131799.25%1071.43%
Alan Cox60.45%17.14%
Christoph Hellwig20.15%17.14%
Greg Kroah-Hartman10.08%17.14%
Luben Tuikov10.08%17.14%
Total1327100.00%14100.00%
Directory: drivers/scsi
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.