ncr53c9x.h
来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 671 行 · 第 1/3 页
H
671 行
#define esp_cfg3 io_addr + (12<<(esp->shift)) /* rw Third configuration register 0x30 */#define esp_cfg4 io_addr + (13<<(esp->shift)) /* rw Fourth configuration register 0x34 */ /* The following is found on all chips except the NCR53C90 (ESP100) */#define esp_tchi io_addr + (14<<(esp->shift)) /* rw High bits of transfer count 0x38 */#define esp_uid esp_tchi /* ro Unique ID code 0x38 */#define esp_fgrnd io_addr + (15<<(esp->shift)) /* rw Data base for fifo 0x3c */};#endif#else /* !defined(__i386__) && !defined(__x86_64__) */#define esp_write(__reg, __val) outb((__val), (__reg))#define esp_read(__reg) inb((__reg))struct ESP_regs { unsigned int io_addr; /* Access Description Offset */#define esp_tclow io_addr /* rw Low bits of the transfer count 0x00 */#define esp_tcmed io_addr + 1 /* rw Mid bits of the transfer count 0x04 */#define esp_fdata io_addr + 2 /* rw FIFO data bits 0x08 */#define esp_cmnd io_addr + 3 /* rw SCSI command bits 0x0c */#define esp_status io_addr + 4 /* ro ESP status register 0x10 */#define esp_busid esp_status /* wo Bus ID for select/reselect 0x10 */#define esp_intrpt io_addr + 5 /* ro Kind of interrupt 0x14 */#define esp_timeo esp_intrpt /* wo Timeout value for select/resel 0x14 */#define esp_sstep io_addr + 6 /* ro Sequence step register 0x18 */#define esp_stp esp_sstep /* wo Transfer period per sync 0x18 */#define esp_fflags io_addr + 7 /* ro Bits of current FIFO info 0x1c */#define esp_soff esp_fflags /* wo Sync offset 0x1c */#define esp_cfg1 io_addr + 8 /* rw First configuration register 0x20 */#define esp_cfact io_addr + 9 /* wo Clock conversion factor 0x24 */#define esp_ctest io_addr + 10 /* wo Chip test register 0x28 */#define esp_cfg2 io_addr + 11 /* rw Second configuration register 0x2c */ /* The following is only found on the 53C9X series SCSI chips */#define esp_cfg3 io_addr + 12 /* rw Third configuration register 0x30 */#define esp_cfg4 io_addr + 13 /* rw Fourth configuration register 0x34 */ /* The following is found on all chips except the NCR53C90 (ESP100) */#define esp_tchi io_addr + 14 /* rw High bits of transfer count 0x38 */#define esp_uid esp_tchi /* ro Unique ID code 0x38 */#define esp_fgrnd io_addr + 15 /* rw Data base for fifo 0x3c */};#endif /* !defined(__i386__) && !defined(__x86_64__) *//* Various revisions of the ESP board. */enum esp_rev { esp100 = 0x00, /* NCR53C90 - very broken */ esp100a = 0x01, /* NCR53C90A */ esp236 = 0x02, fas236 = 0x03, fas100a = 0x04, fast = 0x05, fas366 = 0x06, fas216 = 0x07, fsc = 0x08, /* SYM53C94-2 */ espunknown = 0x09};/* We allocate one of these for each scsi device and attach it to * SDptr->hostdata for use in the driver */struct esp_device { unsigned char sync_min_period; unsigned char sync_max_offset; unsigned sync:1; unsigned wide:1; unsigned disconnect:1;};/* We get one of these for each ESP probed. */struct NCR_ESP { struct NCR_ESP *next; /* Next ESP on probed or NULL */ struct ESP_regs *eregs; /* All esp registers */ int dma; /* Who I do transfers with. */ void *dregs; /* And his registers. */ struct Scsi_Host *ehost; /* Backpointer to SCSI Host */ void *edev; /* Pointer to controller base/SBus */ int esp_id; /* Unique per-ESP ID number */ /* ESP Configuration Registers */ unsigned char config1; /* Copy of the 1st config register */ unsigned char config2; /* Copy of the 2nd config register */ unsigned char config3[16]; /* Copy of the 3rd config register */ /* The current command we are sending to the ESP chip. This esp_command * ptr needs to be mapped in DVMA area so we can send commands and read * from the ESP fifo without burning precious CPU cycles. Programmed I/O * sucks when we have the DVMA to do it for us. The ESP is stupid and will * only send out 6, 10, and 12 byte SCSI commands, others we need to send * one byte at a time. esp_slowcmd being set says that we are doing one * of the command types ESP doesn't understand, esp_scmdp keeps track of * which byte we are sending, esp_scmdleft says how many bytes to go. */ volatile unchar *esp_command; /* Location of command (CPU view) */ __u32 esp_command_dvma; /* Location of command (DVMA view) */ unsigned char esp_clen; /* Length of this command */ unsigned char esp_slowcmd; unsigned char *esp_scmdp; unsigned char esp_scmdleft; /* The following are used to determine the cause of an IRQ. Upon every * IRQ entry we synchronize these with the hardware registers. */ unchar ireg; /* Copy of ESP interrupt register */ unchar sreg; /* Same for ESP status register */ unchar seqreg; /* The ESP sequence register */ /* The following is set when a premature interrupt condition is detected * in some FAS revisions. */ unchar fas_premature_intr_workaround; /* To save register writes to the ESP, which can be expensive, we * keep track of the previous value that various registers had for * the last target we connected to. If they are the same for the * current target, we skip the register writes as they are not needed. */ unchar prev_soff, prev_stp, prev_cfg3; /* For each target we keep track of save/restore data * pointer information. This needs to be updated majorly * when we add support for tagged queueing. -DaveM */ struct esp_pointers { char *saved_ptr; struct scatterlist *saved_buffer; int saved_this_residual; int saved_buffers_residual; } data_pointers[16] /*XXX [MAX_TAGS_PER_TARGET]*/; /* Clock periods, frequencies, synchronization, etc. */ unsigned int cfreq; /* Clock frequency in HZ */ unsigned int cfact; /* Clock conversion factor */ unsigned int ccycle; /* One ESP clock cycle */ unsigned int ctick; /* One ESP clock time */ unsigned int radelay; /* FAST chip req/ack delay */ unsigned int neg_defp; /* Default negotiation period */ unsigned int sync_defp; /* Default sync transfer period */ unsigned int max_period; /* longest our period can be */ unsigned int min_period; /* shortest period we can withstand */ /* For slow to medium speed input clock rates we shoot for 5mb/s, * but for high input clock rates we try to do 10mb/s although I * don't think a transfer can even run that fast with an ESP even * with DMA2 scatter gather pipelining. */#define SYNC_DEFP_SLOW 0x32 /* 5mb/s */#define SYNC_DEFP_FAST 0x19 /* 10mb/s */ unsigned int snip; /* Sync. negotiation in progress */ unsigned int wnip; /* WIDE negotiation in progress */ unsigned int targets_present; /* targets spoken to before */ int current_transfer_size; /* Set at beginning of data dma */ unchar espcmdlog[32]; /* Log of current esp cmds sent. */ unchar espcmdent; /* Current entry in esp cmd log. */ /* Misc. info about this ESP */ enum esp_rev erev; /* ESP revision */ int irq; /* IRQ for this ESP */ int scsi_id; /* Who am I as initiator? */ int scsi_id_mask; /* Bitmask of 'me'. */ int diff; /* Differential SCSI bus? */ int slot; /* Slot the adapter occupies */ /* Our command queues, only one cmd lives in the current_SC queue. */ Scsi_Cmnd *issue_SC; /* Commands to be issued */ Scsi_Cmnd *current_SC; /* Who is currently working the bus */ Scsi_Cmnd *disconnected_SC; /* Commands disconnected from the bus */ /* Message goo */ unchar cur_msgout[16]; unchar cur_msgin[16]; unchar prevmsgout, prevmsgin; unchar msgout_len, msgin_len; unchar msgout_ctr, msgin_ctr; /* States that we cannot keep in the per cmd structure because they * cannot be assosciated with any specific command. */ unchar resetting_bus; wait_queue_head_t reset_queue; unchar do_pio_cmds; /* Do command transfer with pio */ /* How much bits do we have to shift the registers */ unsigned char shift; /* Functions handling DMA */ /* Required functions */ int (*dma_bytes_sent)(struct NCR_ESP *, int); int (*dma_can_transfer)(struct NCR_ESP *, Scsi_Cmnd *); void (*dma_dump_state)(struct NCR_ESP *); void (*dma_init_read)(struct NCR_ESP *, __u32, int); void (*dma_init_write)(struct NCR_ESP *, __u32, int); void (*dma_ints_off)(struct NCR_ESP *); void (*dma_ints_on)(struct NCR_ESP *); int (*dma_irq_p)(struct NCR_ESP *); int (*dma_ports_p)(struct NCR_ESP *); void (*dma_setup)(struct NCR_ESP *, __u32, int, int); /* Optional functions (i.e. may be initialized to 0) */ void (*dma_barrier)(struct NCR_ESP *); void (*dma_drain)(struct NCR_ESP *); void (*dma_invalidate)(struct NCR_ESP *); void (*dma_irq_entry)(struct NCR_ESP *); void (*dma_irq_exit)(struct NCR_ESP *); void (*dma_led_off)(struct NCR_ESP *); void (*dma_led_on)(struct NCR_ESP *); void (*dma_poll)(struct NCR_ESP *, unsigned char *); void (*dma_reset)(struct NCR_ESP *); /* Optional virtual DMA functions */ void (*dma_mmu_get_scsi_one)(struct NCR_ESP *, Scsi_Cmnd *); void (*dma_mmu_get_scsi_sgl)(struct NCR_ESP *, Scsi_Cmnd *); void (*dma_mmu_release_scsi_one)(struct NCR_ESP *, Scsi_Cmnd *); void (*dma_mmu_release_scsi_sgl)(struct NCR_ESP *, Scsi_Cmnd *); void (*dma_advance_sg)(Scsi_Cmnd *);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?