fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / scsi / aic7xxx / aic79xx.h
index be65968..170a434 100644 (file)
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#95 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#109 $
  *
  * $FreeBSD$
  */
@@ -53,14 +53,6 @@ struct ahd_platform_data;
 struct scb_platform_data;
 
 /****************************** Useful Macros *********************************/
-#ifndef MAX
-#define MAX(a,b) (((a) > (b)) ? (a) : (b))
-#endif
-
-#ifndef MIN
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-#endif
-
 #ifndef TRUE
 #define TRUE 1
 #endif
@@ -68,15 +60,12 @@ struct scb_platform_data;
 #define FALSE 0
 #endif
 
-#define NUM_ELEMENTS(array) (sizeof(array) / sizeof(*array))
-
 #define ALL_CHANNELS '\0'
 #define ALL_TARGETS_MASK 0xFFFF
 #define INITIATOR_WILDCARD     (~0)
 #define        SCB_LIST_NULL           0xFF00
 #define        SCB_LIST_NULL_LE        (ahd_htole16(SCB_LIST_NULL))
-#define QOUTFIFO_ENTRY_VALID 0x8000
-#define QOUTFIFO_ENTRY_VALID_LE (ahd_htole16(0x8000))
+#define QOUTFIFO_ENTRY_VALID 0x80
 #define SCBID_IS_NULL(scbid) (((scbid) & 0xFF00 ) == SCB_LIST_NULL)
 
 #define SCSIID_TARGET(ahd, scsiid)     \
@@ -223,6 +212,7 @@ typedef enum {
 typedef enum {
        AHD_FENONE              = 0x00000,
        AHD_WIDE                = 0x00001,/* Wide Channel */
+       AHD_AIC79XXB_SLOWCRC    = 0x00002,/* SLOWCRC bit should be set */
        AHD_MULTI_FUNC          = 0x00100,/* Multi-Function/Channel Device */
        AHD_TARGETMODE          = 0x01000,/* Has tested target mode support */
        AHD_MULTIROLE           = 0x02000,/* Space for two roles at a time */
@@ -372,7 +362,7 @@ typedef enum {
        AHD_CURRENT_SENSING   = 0x40000,
        AHD_SCB_CONFIG_USED   = 0x80000,/* No SEEPROM but SCB had info. */
        AHD_HP_BOARD          = 0x100000,
-       AHD_RESET_POLL_ACTIVE = 0x200000,
+       AHD_BUS_RESET_ACTIVE  = 0x200000,
        AHD_UPDATE_PEND_CMDS  = 0x400000,
        AHD_RUNNING_QOUTFIFO  = 0x800000,
        AHD_HAD_FIRST_SEL     = 0x1000000
@@ -549,7 +539,7 @@ struct ahd_dma64_seg {
 
 struct map_node {
        bus_dmamap_t             dmamap;
-       bus_addr_t               physaddr;
+       dma_addr_t               physaddr;
        uint8_t                 *vaddr;
        SLIST_ENTRY(map_node)    links;
 };
@@ -589,7 +579,7 @@ typedef enum {
        SCB_PACKETIZED          = 0x00800,
        SCB_EXPECT_PPR_BUSFREE  = 0x01000,
        SCB_PKT_SENSE           = 0x02000,
-       SCB_CMDPHASE_ABORT      = 0x04000,
+       SCB_EXTERNAL_RESET      = 0x04000,/* Device was reset externally */
        SCB_ON_COL_LIST         = 0x08000,
        SCB_SILENT              = 0x10000 /*
                                           * Be quiet about transmission type
@@ -626,8 +616,8 @@ struct scb {
        struct map_node          *sense_map;
        void                     *sg_list;
        uint8_t                  *sense_data;
-       bus_addr_t                sg_list_busaddr;
-       bus_addr_t                sense_busaddr;
+       dma_addr_t                sg_list_busaddr;
+       dma_addr_t                sense_busaddr;
        u_int                     sg_count;/* How full ahd_dma_seg is */
 #define        AHD_MAX_LQ_CRC_ERRORS 5
        u_int                     crc_retry_count;
@@ -974,8 +964,6 @@ int         ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf,
 
 int            ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf,
                                  u_int start_addr, u_int count);
-int            ahd_wait_seeprom(struct ahd_softc *ahd);
-int            ahd_verify_vpd_cksum(struct vpd_config *vpd);
 int            ahd_verify_cksum(struct seeprom_config *sc);
 int            ahd_acquire_seeprom(struct ahd_softc *ahd);
 void           ahd_release_seeprom(struct ahd_softc *ahd);
@@ -1053,6 +1041,13 @@ typedef uint8_t ahd_mode_state;
 
 typedef void ahd_callback_t (void *);
 
+struct ahd_completion
+{
+       uint16_t        tag;
+       uint8_t         sg_status;
+       uint8_t         valid_tag;
+};
+
 struct ahd_softc {
        bus_space_tag_t           tags[2];
        bus_space_handle_t        bshs[2];
@@ -1062,6 +1057,7 @@ struct ahd_softc {
        struct scb_data           scb_data;
 
        struct hardware_scb      *next_queued_hscb;
+       struct map_node          *next_queued_hscb_map;
 
        /*
         * SCBs that have been sent to the controller
@@ -1140,16 +1136,23 @@ struct ahd_softc {
        ahd_flag                  flags;
        struct seeprom_config    *seep_config;
 
-       /* Values to store in the SEQCTL register for pause and unpause */
-       uint8_t                   unpause;
-       uint8_t                   pause;
-
        /* Command Queues */
+       struct ahd_completion     *qoutfifo;
        uint16_t                  qoutfifonext;
        uint16_t                  qoutfifonext_valid_tag;
        uint16_t                  qinfifonext;
        uint16_t                  qinfifo[AHD_SCB_MAX];
-       uint16_t                 *qoutfifo;
+
+       /*
+        * Our qfreeze count.  The sequencer compares
+        * this value with its own counter to determine
+        * whether to allow selections to occur.
+        */
+       uint16_t                  qfreeze_cnt;
+
+       /* Values to store in the SEQCTL register for pause and unpause */
+       uint8_t                   unpause;
+       uint8_t                   pause;
 
        /* Critical Section Data */
        struct cs                *critical_sections;
@@ -1197,8 +1200,7 @@ struct ahd_softc {
         */
        bus_dma_tag_t             parent_dmat;
        bus_dma_tag_t             shared_data_dmat;
-       bus_dmamap_t              shared_data_dmamap;
-       bus_addr_t                shared_data_busaddr;
+       struct map_node           shared_data_map;
 
        /* Information saved through suspend/resume cycles */
        struct ahd_suspend_state  suspend_state;
@@ -1247,9 +1249,6 @@ struct ahd_softc {
        uint16_t                  user_tagenable;/* Tagged Queuing allowed */
 };
 
-TAILQ_HEAD(ahd_softc_tailq, ahd_softc);
-extern struct ahd_softc_tailq ahd_tailq;
-
 /*************************** IO Cell Configuration ****************************/
 #define        AHD_PRECOMP_SLEW_INDEX                                          \
     (AHD_ANNEXCOL_PRECOMP_SLEW - AHD_ANNEXCOL_PER_DEV0)
@@ -1299,9 +1298,9 @@ struct ahd_devinfo {
 };
 
 /****************************** PCI Structures ********************************/
-#define AHD_PCI_IOADDR0        PCIR_MAPS       /* I/O BAR*/
-#define AHD_PCI_MEMADDR        (PCIR_MAPS + 4) /* Memory BAR */
-#define AHD_PCI_IOADDR1        (PCIR_MAPS + 12)/* Second I/O BAR */
+#define AHD_PCI_IOADDR0        PCIR_BAR(0)     /* I/O BAR*/
+#define AHD_PCI_MEMADDR        PCIR_BAR(1)     /* Memory BAR */
+#define AHD_PCI_IOADDR1        PCIR_BAR(3)     /* Second I/O BAR */
 
 typedef int (ahd_device_setup_t)(struct ahd_softc *);
 
@@ -1311,8 +1310,6 @@ struct ahd_pci_identity {
        char                    *name;
        ahd_device_setup_t      *setup;
 };
-extern struct ahd_pci_identity ahd_pci_ident_table [];
-extern const u_int ahd_num_pci_devs;
 
 /***************************** VL/EISA Declarations ***************************/
 struct aic7770_identity {
@@ -1330,15 +1327,6 @@ extern const int ahd_num_aic7770_devs;
 /*************************** Function Declarations ****************************/
 /******************************************************************************/
 void                   ahd_reset_cmds_pending(struct ahd_softc *ahd);
-u_int                  ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
-void                   ahd_busy_tcl(struct ahd_softc *ahd,
-                                    u_int tcl, u_int busyid);
-static __inline void   ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl);
-static __inline void
-ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl)
-{
-       ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL);
-}
 
 /***************************** PCI Front End *********************************/
 struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t);
@@ -1347,7 +1335,6 @@ int                         ahd_pci_config(struct ahd_softc *,
 int    ahd_pci_test_register_access(struct ahd_softc *);
 
 /************************** SCB and SCB queue management **********************/
-int            ahd_probe_scbs(struct ahd_softc *);
 void           ahd_qinfifo_requeue_tail(struct ahd_softc *ahd,
                                         struct scb *scb);
 int            ahd_match_scb(struct ahd_softc *ahd, struct scb *scb,
@@ -1365,35 +1352,20 @@ int                      ahd_parse_vpddata(struct ahd_softc *ahd,
 int                     ahd_parse_cfgdata(struct ahd_softc *ahd,
                                           struct seeprom_config *sc);
 void                    ahd_intr_enable(struct ahd_softc *ahd, int enable);
-void                    ahd_update_coalescing_values(struct ahd_softc *ahd,
-                                                     u_int timer,
-                                                     u_int maxcmds,
-                                                     u_int mincmds);
-void                    ahd_enable_coalescing(struct ahd_softc *ahd,
-                                              int enable);
 void                    ahd_pause_and_flushwork(struct ahd_softc *ahd);
 int                     ahd_suspend(struct ahd_softc *ahd); 
-int                     ahd_resume(struct ahd_softc *ahd);
-void                    ahd_softc_insert(struct ahd_softc *);
-struct ahd_softc       *ahd_find_softc(struct ahd_softc *ahd);
 void                    ahd_set_unit(struct ahd_softc *, int);
 void                    ahd_set_name(struct ahd_softc *, char *);
 struct scb             *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx);
 void                    ahd_free_scb(struct ahd_softc *ahd, struct scb *scb);
-void                    ahd_alloc_scbs(struct ahd_softc *ahd);
 void                    ahd_free(struct ahd_softc *ahd);
 int                     ahd_reset(struct ahd_softc *ahd, int reinit);
-void                    ahd_shutdown(void *arg);
 int                     ahd_write_flexport(struct ahd_softc *ahd,
                                            u_int addr, u_int value);
 int                     ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
                                           uint8_t *value);
-int                     ahd_wait_flexport(struct ahd_softc *ahd);
 
 /*************************** Interrupt Services *******************************/
-void                   ahd_pci_intr(struct ahd_softc *ahd);
-void                   ahd_clear_intstat(struct ahd_softc *ahd);
-void                   ahd_flush_qoutfifo(struct ahd_softc *ahd);
 void                   ahd_run_qoutfifo(struct ahd_softc *ahd);
 #ifdef AHD_TARGET_MODE
 void                   ahd_run_tqinfifo(struct ahd_softc *ahd, int paused);
@@ -1402,7 +1374,6 @@ void                      ahd_handle_hwerrint(struct ahd_softc *ahd);
 void                   ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat);
 void                   ahd_handle_scsiint(struct ahd_softc *ahd,
                                           u_int intstat);
-void                   ahd_clear_critical_section(struct ahd_softc *ahd);
 
 /***************************** Error Recovery *********************************/
 typedef enum {
@@ -1419,23 +1390,9 @@ int                      ahd_search_disc_list(struct ahd_softc *ahd, int target,
                                             char channel, int lun, u_int tag,
                                             int stop_on_first, int remove,
                                             int save_state);
-void                   ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb);
 int                    ahd_reset_channel(struct ahd_softc *ahd, char channel,
                                          int initiate_reset);
-int                    ahd_abort_scbs(struct ahd_softc *ahd, int target,
-                                      char channel, int lun, u_int tag,
-                                      role_t role, uint32_t status);
-void                   ahd_restart(struct ahd_softc *ahd);
-void                   ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo);
-void                   ahd_handle_scb_status(struct ahd_softc *ahd,
-                                             struct scb *scb);
-void                   ahd_handle_scsi_status(struct ahd_softc *ahd,
-                                              struct scb *scb);
-void                   ahd_calc_residual(struct ahd_softc *ahd,
-                                         struct scb *scb);
 /*************************** Utility Functions ********************************/
-struct ahd_phase_table_entry*
-                       ahd_lookup_phase_entry(int phase);
 void                   ahd_compile_devinfo(struct ahd_devinfo *devinfo,
                                            u_int our_id, u_int target,
                                            u_int lun, char channel,
@@ -1443,14 +1400,6 @@ void                     ahd_compile_devinfo(struct ahd_devinfo *devinfo,
 /************************** Transfer Negotiation ******************************/
 void                   ahd_find_syncrate(struct ahd_softc *ahd, u_int *period,
                                          u_int *ppr_options, u_int maxsync);
-void                   ahd_validate_offset(struct ahd_softc *ahd,
-                                           struct ahd_initiator_tinfo *tinfo,
-                                           u_int period, u_int *offset,
-                                           int wide, role_t role);
-void                   ahd_validate_width(struct ahd_softc *ahd,
-                                          struct ahd_initiator_tinfo *tinfo,
-                                          u_int *bus_width,
-                                          role_t role);
 /*
  * Negotiation types.  These are used to qualify if we should renegotiate
  * even if our goal and current transport parameters are identical.
@@ -1479,10 +1428,6 @@ typedef enum {
        AHD_QUEUE_TAGGED
 } ahd_queue_alg;
 
-void                   ahd_set_tags(struct ahd_softc *ahd,
-                                    struct ahd_devinfo *devinfo,
-                                    ahd_queue_alg alg);
-
 /**************************** Target Mode *************************************/
 #ifdef AHD_TARGET_MODE
 void           ahd_send_lstate_events(struct ahd_softc *,
@@ -1520,11 +1465,8 @@ extern uint32_t ahd_debug;
 #define AHD_SHOW_INT_COALESCING        0x10000
 #define AHD_DEBUG_SEQUENCER    0x20000
 #endif
-void                   ahd_print_scb(struct scb *scb);
 void                   ahd_print_devinfo(struct ahd_softc *ahd,
                                          struct ahd_devinfo *devinfo);
-void                   ahd_dump_sglist(struct scb *scb);
-void                   ahd_dump_all_cards_state(void);
 void                   ahd_dump_card_state(struct ahd_softc *ahd);
 int                    ahd_print_register(ahd_reg_parse_entry_t *table,
                                           u_int num_entries,
@@ -1533,5 +1475,4 @@ int                       ahd_print_register(ahd_reg_parse_entry_t *table,
                                           u_int value,
                                           u_int *cur_column,
                                           u_int wrap_point);
-void                   ahd_dump_scbs(struct ahd_softc *ahd);
 #endif /* _AIC79XX_H_ */