0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 #ifndef _AIC7XXX_H_
0046 #define _AIC7XXX_H_
0047
0048
0049 #include "aic7xxx_reg.h"
0050
0051
0052 struct ahc_platform_data;
0053 struct scb_platform_data;
0054 struct seeprom_descriptor;
0055
0056
0057 #ifndef TRUE
0058 #define TRUE 1
0059 #endif
0060 #ifndef FALSE
0061 #define FALSE 0
0062 #endif
0063
0064 #define ALL_CHANNELS '\0'
0065 #define ALL_TARGETS_MASK 0xFFFF
0066 #define INITIATOR_WILDCARD (~0)
0067
0068 #define SCSIID_TARGET(ahc, scsiid) \
0069 (((scsiid) & ((((ahc)->features & AHC_TWIN) != 0) ? TWIN_TID : TID)) \
0070 >> TID_SHIFT)
0071 #define SCSIID_OUR_ID(scsiid) \
0072 ((scsiid) & OID)
0073 #define SCSIID_CHANNEL(ahc, scsiid) \
0074 ((((ahc)->features & AHC_TWIN) != 0) \
0075 ? ((((scsiid) & TWIN_CHNLB) != 0) ? 'B' : 'A') \
0076 : 'A')
0077 #define SCB_IS_SCSIBUS_B(ahc, scb) \
0078 (SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid) == 'B')
0079 #define SCB_GET_OUR_ID(scb) \
0080 SCSIID_OUR_ID((scb)->hscb->scsiid)
0081 #define SCB_GET_TARGET(ahc, scb) \
0082 SCSIID_TARGET((ahc), (scb)->hscb->scsiid)
0083 #define SCB_GET_CHANNEL(ahc, scb) \
0084 SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid)
0085 #define SCB_GET_LUN(scb) \
0086 ((scb)->hscb->lun & LID)
0087 #define SCB_GET_TARGET_OFFSET(ahc, scb) \
0088 (SCB_GET_TARGET(ahc, scb) + (SCB_IS_SCSIBUS_B(ahc, scb) ? 8 : 0))
0089 #define SCB_GET_TARGET_MASK(ahc, scb) \
0090 (0x01 << (SCB_GET_TARGET_OFFSET(ahc, scb)))
0091 #ifdef AHC_DEBUG
0092 #define SCB_IS_SILENT(scb) \
0093 ((ahc_debug & AHC_SHOW_MASKED_ERRORS) == 0 \
0094 && (((scb)->flags & SCB_SILENT) != 0))
0095 #else
0096 #define SCB_IS_SILENT(scb) \
0097 (((scb)->flags & SCB_SILENT) != 0)
0098 #endif
0099 #define TCL_TARGET_OFFSET(tcl) \
0100 ((((tcl) >> 4) & TID) >> 4)
0101 #define TCL_LUN(tcl) \
0102 (tcl & (AHC_NUM_LUNS - 1))
0103 #define BUILD_TCL(scsiid, lun) \
0104 ((lun) | (((scsiid) & TID) << 4))
0105
0106 #ifndef AHC_TARGET_MODE
0107 #undef AHC_TMODE_ENABLE
0108 #define AHC_TMODE_ENABLE 0
0109 #endif
0110
0111
0112
0113
0114
0115 #define AHC_NUM_TARGETS 16
0116
0117
0118
0119
0120
0121
0122
0123 #define AHC_NUM_LUNS 64
0124
0125
0126
0127
0128 #define AHC_MAXTRANSFER_SIZE 0x00ffffff
0129
0130
0131
0132
0133
0134
0135 #define AHC_SCB_MAX 255
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155 #define AHC_MAX_QUEUE 253
0156
0157
0158
0159
0160
0161
0162 #define AHC_SCB_MAX_ALLOC (AHC_MAX_QUEUE+1)
0163
0164
0165
0166
0167
0168
0169 #define AHC_TMODE_CMDS 256
0170
0171
0172 #define AHC_BUSRESET_DELAY 25
0173
0174
0175
0176
0177
0178
0179 typedef enum {
0180 AHC_NONE = 0x0000,
0181 AHC_CHIPID_MASK = 0x00FF,
0182 AHC_AIC7770 = 0x0001,
0183 AHC_AIC7850 = 0x0002,
0184 AHC_AIC7855 = 0x0003,
0185 AHC_AIC7859 = 0x0004,
0186 AHC_AIC7860 = 0x0005,
0187 AHC_AIC7870 = 0x0006,
0188 AHC_AIC7880 = 0x0007,
0189 AHC_AIC7895 = 0x0008,
0190 AHC_AIC7895C = 0x0009,
0191 AHC_AIC7890 = 0x000a,
0192 AHC_AIC7896 = 0x000b,
0193 AHC_AIC7892 = 0x000c,
0194 AHC_AIC7899 = 0x000d,
0195 AHC_VL = 0x0100,
0196 AHC_EISA = 0x0200,
0197 AHC_PCI = 0x0400,
0198 AHC_BUS_MASK = 0x0F00
0199 } ahc_chip;
0200
0201
0202
0203
0204 typedef enum {
0205 AHC_FENONE = 0x00000,
0206 AHC_ULTRA = 0x00001,
0207 AHC_ULTRA2 = 0x00002,
0208 AHC_WIDE = 0x00004,
0209 AHC_TWIN = 0x00008,
0210 AHC_MORE_SRAM = 0x00010,
0211 AHC_CMD_CHAN = 0x00020,
0212 AHC_QUEUE_REGS = 0x00040,
0213 AHC_SG_PRELOAD = 0x00080,
0214 AHC_SPIOCAP = 0x00100,
0215 AHC_MULTI_TID = 0x00200,
0216 AHC_HS_MAILBOX = 0x00400,
0217 AHC_DT = 0x00800,
0218 AHC_NEW_TERMCTL = 0x01000,
0219 AHC_MULTI_FUNC = 0x02000,
0220 AHC_LARGE_SCBS = 0x04000,
0221 AHC_AUTORATE = 0x08000,
0222 AHC_AUTOPAUSE = 0x10000,
0223 AHC_TARGETMODE = 0x20000,
0224 AHC_MULTIROLE = 0x40000,
0225 AHC_REMOVABLE = 0x80000,
0226 AHC_HVD = 0x100000,
0227 AHC_AIC7770_FE = AHC_FENONE,
0228
0229
0230
0231
0232
0233
0234
0235 AHC_AIC7850_FE = AHC_SPIOCAP|AHC_AUTOPAUSE|AHC_TARGETMODE|AHC_ULTRA,
0236 AHC_AIC7860_FE = AHC_AIC7850_FE,
0237 AHC_AIC7870_FE = AHC_TARGETMODE|AHC_AUTOPAUSE,
0238 AHC_AIC7880_FE = AHC_AIC7870_FE|AHC_ULTRA,
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248 AHC_AIC7890_FE = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA2
0249 |AHC_QUEUE_REGS|AHC_SG_PRELOAD|AHC_MULTI_TID
0250 |AHC_HS_MAILBOX|AHC_NEW_TERMCTL|AHC_LARGE_SCBS
0251 |AHC_TARGETMODE,
0252 AHC_AIC7892_FE = AHC_AIC7890_FE|AHC_DT|AHC_AUTORATE|AHC_AUTOPAUSE,
0253 AHC_AIC7895_FE = AHC_AIC7880_FE|AHC_MORE_SRAM|AHC_AUTOPAUSE
0254 |AHC_CMD_CHAN|AHC_MULTI_FUNC|AHC_LARGE_SCBS,
0255 AHC_AIC7895C_FE = AHC_AIC7895_FE|AHC_MULTI_TID,
0256 AHC_AIC7896_FE = AHC_AIC7890_FE|AHC_MULTI_FUNC,
0257 AHC_AIC7899_FE = AHC_AIC7892_FE|AHC_MULTI_FUNC
0258 } ahc_feature;
0259
0260
0261
0262
0263 typedef enum {
0264 AHC_BUGNONE = 0x00,
0265
0266
0267
0268
0269
0270 AHC_TMODE_WIDEODD_BUG = 0x01,
0271
0272
0273
0274
0275
0276 AHC_AUTOFLUSH_BUG = 0x02,
0277
0278
0279
0280 AHC_CACHETHEN_BUG = 0x04,
0281
0282
0283
0284
0285 AHC_CACHETHEN_DIS_BUG = 0x08,
0286
0287
0288
0289 AHC_PCI_2_1_RETRY_BUG = 0x10,
0290
0291
0292
0293
0294
0295 AHC_PCI_MWI_BUG = 0x20,
0296
0297
0298
0299
0300
0301
0302 AHC_SCBCHAN_UPLOAD_BUG = 0x40
0303 } ahc_bug;
0304
0305
0306
0307
0308
0309
0310 typedef enum {
0311 AHC_FNONE = 0x000,
0312 AHC_PRIMARY_CHANNEL = 0x003,
0313
0314
0315
0316 AHC_USEDEFAULTS = 0x004,
0317
0318
0319
0320
0321
0322 AHC_SEQUENCER_DEBUG = 0x008,
0323 AHC_SHARED_SRAM = 0x010,
0324 AHC_LARGE_SEEPROM = 0x020,
0325 AHC_RESET_BUS_A = 0x040,
0326 AHC_RESET_BUS_B = 0x080,
0327 AHC_EXTENDED_TRANS_A = 0x100,
0328 AHC_EXTENDED_TRANS_B = 0x200,
0329 AHC_TERM_ENB_A = 0x400,
0330 AHC_TERM_ENB_B = 0x800,
0331 AHC_INITIATORROLE = 0x1000,
0332
0333
0334
0335 AHC_TARGETROLE = 0x2000,
0336
0337
0338
0339 AHC_NEWEEPROM_FMT = 0x4000,
0340 AHC_TQINFIFO_BLOCKED = 0x10000,
0341 AHC_INT50_SPEEDFLEX = 0x20000,
0342
0343
0344
0345 AHC_SCB_BTT = 0x40000,
0346
0347
0348
0349
0350 AHC_BIOS_ENABLED = 0x80000,
0351 AHC_ALL_INTERRUPTS = 0x100000,
0352 AHC_PAGESCBS = 0x400000,
0353 AHC_EDGE_INTERRUPT = 0x800000,
0354 AHC_39BIT_ADDRESSING = 0x1000000,
0355 AHC_LSCBS_ENABLED = 0x2000000,
0356 AHC_SCB_CONFIG_USED = 0x4000000,
0357 AHC_NO_BIOS_INIT = 0x8000000,
0358 AHC_DISABLE_PCI_PERR = 0x10000000,
0359 AHC_HAS_TERM_LOGIC = 0x20000000
0360 } ahc_flag;
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386 struct status_pkt {
0387 uint32_t residual_datacnt;
0388 uint32_t residual_sg_ptr;
0389 uint8_t scsi_status;
0390 };
0391
0392
0393
0394
0395 struct target_data {
0396 uint32_t residual_datacnt;
0397 uint32_t residual_sg_ptr;
0398 uint8_t scsi_status;
0399 uint8_t target_phases;
0400 uint8_t data_phase;
0401 uint8_t initiator_tag;
0402 };
0403
0404 struct hardware_scb {
0405 union {
0406
0407
0408
0409
0410
0411
0412 uint8_t cdb[12];
0413 uint32_t cdb_ptr;
0414 struct status_pkt status;
0415 struct target_data tdata;
0416 } shared_data;
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454 uint32_t dataptr;
0455 uint32_t datacnt;
0456
0457
0458
0459
0460 uint32_t sgptr;
0461 #define SG_PTR_MASK 0xFFFFFFF8
0462 uint8_t control;
0463 uint8_t scsiid;
0464 uint8_t lun;
0465 uint8_t tag;
0466
0467
0468
0469 uint8_t cdb_len;
0470 uint8_t scsirate;
0471 uint8_t scsioffset;
0472 uint8_t next;
0473
0474
0475
0476
0477
0478 uint8_t cdb32[32];
0479
0480
0481
0482
0483
0484
0485
0486
0487 };
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504 struct ahc_dma_seg {
0505 uint32_t addr;
0506 uint32_t len;
0507 #define AHC_DMA_LAST_SEG 0x80000000
0508 #define AHC_SG_HIGH_ADDR_MASK 0x7F000000
0509 #define AHC_SG_LEN_MASK 0x00FFFFFF
0510 };
0511
0512 struct sg_map_node {
0513 bus_dmamap_t sg_dmamap;
0514 dma_addr_t sg_physaddr;
0515 struct ahc_dma_seg* sg_vaddr;
0516 SLIST_ENTRY(sg_map_node) links;
0517 };
0518
0519
0520
0521
0522 typedef enum {
0523 SCB_FREE = 0x0000,
0524 SCB_OTHERTCL_TIMEOUT = 0x0002,
0525
0526
0527
0528
0529
0530
0531
0532 SCB_DEVICE_RESET = 0x0004,
0533 SCB_SENSE = 0x0008,
0534 SCB_CDB32_PTR = 0x0010,
0535 SCB_RECOVERY_SCB = 0x0020,
0536 SCB_AUTO_NEGOTIATE = 0x0040,
0537 SCB_NEGOTIATE = 0x0080,
0538 SCB_ABORT = 0x0100,
0539 SCB_UNTAGGEDQ = 0x0200,
0540 SCB_ACTIVE = 0x0400,
0541 SCB_TARGET_IMMEDIATE = 0x0800,
0542 SCB_TRANSMISSION_ERROR = 0x1000,
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552 SCB_TARGET_SCB = 0x2000,
0553 SCB_SILENT = 0x4000
0554
0555
0556
0557
0558
0559 } scb_flag;
0560
0561 struct scb {
0562 struct hardware_scb *hscb;
0563 union {
0564 SLIST_ENTRY(scb) sle;
0565 TAILQ_ENTRY(scb) tqe;
0566 } links;
0567 LIST_ENTRY(scb) pending_links;
0568 ahc_io_ctx_t io_ctx;
0569 struct ahc_softc *ahc_softc;
0570 scb_flag flags;
0571 struct scb_platform_data *platform_data;
0572 struct sg_map_node *sg_map;
0573 struct ahc_dma_seg *sg_list;
0574 dma_addr_t sg_list_phys;
0575 u_int sg_count;
0576 };
0577
0578 struct scb_data {
0579 SLIST_HEAD(, scb) free_scbs;
0580
0581
0582
0583 struct scb *scbindex[256];
0584
0585
0586
0587
0588
0589
0590
0591
0592 struct hardware_scb *hscbs;
0593 struct scb *scbarray;
0594 struct scsi_sense_data *sense;
0595
0596
0597
0598
0599 bus_dma_tag_t hscb_dmat;
0600 bus_dmamap_t hscb_dmamap;
0601 dma_addr_t hscb_busaddr;
0602 bus_dma_tag_t sense_dmat;
0603 bus_dmamap_t sense_dmamap;
0604 dma_addr_t sense_busaddr;
0605 bus_dma_tag_t sg_dmat;
0606 SLIST_HEAD(, sg_map_node) sg_maps;
0607 uint8_t numscbs;
0608 uint8_t maxhscbs;
0609 uint8_t init_level;
0610
0611
0612
0613 };
0614
0615
0616
0617
0618
0619
0620 struct target_cmd {
0621 uint8_t scsiid;
0622 uint8_t identify;
0623 uint8_t bytes[22];
0624
0625
0626
0627
0628 uint8_t cmd_valid;
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639 uint8_t pad[7];
0640 };
0641
0642
0643
0644
0645
0646 #define AHC_TMODE_EVENT_BUFFER_SIZE 8
0647 struct ahc_tmode_event {
0648 uint8_t initiator_id;
0649 uint8_t event_type;
0650 #define EVENT_TYPE_BUS_RESET 0xFF
0651 uint8_t event_arg;
0652 };
0653
0654
0655
0656
0657
0658
0659
0660
0661 #ifdef AHC_TARGET_MODE
0662 struct ahc_tmode_lstate {
0663 struct cam_path *path;
0664 struct ccb_hdr_slist accept_tios;
0665 struct ccb_hdr_slist immed_notifies;
0666 struct ahc_tmode_event event_buffer[AHC_TMODE_EVENT_BUFFER_SIZE];
0667 uint8_t event_r_idx;
0668 uint8_t event_w_idx;
0669 };
0670 #else
0671 struct ahc_tmode_lstate;
0672 #endif
0673
0674
0675 #define AHC_TRANS_CUR 0x01
0676 #define AHC_TRANS_ACTIVE 0x03
0677 #define AHC_TRANS_GOAL 0x04
0678 #define AHC_TRANS_USER 0x08
0679
0680 #define AHC_WIDTH_UNKNOWN 0xFF
0681 #define AHC_PERIOD_UNKNOWN 0xFF
0682 #define AHC_OFFSET_UNKNOWN 0xFF
0683 #define AHC_PPR_OPTS_UNKNOWN 0xFF
0684
0685
0686
0687
0688 struct ahc_transinfo {
0689 uint8_t protocol_version;
0690 uint8_t transport_version;
0691 uint8_t width;
0692 uint8_t period;
0693 uint8_t offset;
0694 uint8_t ppr_options;
0695 };
0696
0697
0698
0699 struct ahc_initiator_tinfo {
0700 uint8_t scsirate;
0701 struct ahc_transinfo curr;
0702 struct ahc_transinfo goal;
0703 struct ahc_transinfo user;
0704 };
0705
0706
0707
0708
0709
0710
0711
0712
0713 struct ahc_tmode_tstate {
0714 struct ahc_tmode_lstate* enabled_luns[AHC_NUM_LUNS];
0715 struct ahc_initiator_tinfo transinfo[AHC_NUM_TARGETS];
0716
0717
0718
0719
0720 uint16_t auto_negotiate;
0721 uint16_t ultraenb;
0722 uint16_t discenable;
0723 uint16_t tagenable;
0724 };
0725
0726
0727
0728
0729 struct ahc_syncrate {
0730 u_int sxfr_u2;
0731 u_int sxfr;
0732 #define ULTRA_SXFR 0x100
0733 #define ST_SXFR 0x010
0734 #define DT_SXFR 0x040
0735 uint8_t period;
0736 const char *rate;
0737 };
0738
0739
0740 #define AHC_ASYNC_XFER_PERIOD 0x45
0741 #define AHC_ULTRA2_XFER_PERIOD 0x0a
0742
0743
0744
0745
0746 #define AHC_SYNCRATE_DT 0
0747 #define AHC_SYNCRATE_ULTRA2 1
0748 #define AHC_SYNCRATE_ULTRA 3
0749 #define AHC_SYNCRATE_FAST 6
0750 #define AHC_SYNCRATE_MAX AHC_SYNCRATE_DT
0751 #define AHC_SYNCRATE_MIN 13
0752
0753
0754
0755
0756
0757
0758 struct ahc_phase_table_entry {
0759 uint8_t phase;
0760 uint8_t mesg_out;
0761 char *phasemsg;
0762 };
0763
0764
0765
0766 struct seeprom_config {
0767
0768
0769
0770 uint16_t device_flags[16];
0771 #define CFXFER 0x0007
0772 #define CFSYNCH 0x0008
0773 #define CFDISC 0x0010
0774 #define CFWIDEB 0x0020
0775 #define CFSYNCHISULTRA 0x0040
0776 #define CFSYNCSINGLE 0x0080
0777 #define CFSTART 0x0100
0778 #define CFINCBIOS 0x0200
0779 #define CFRNFOUND 0x0400
0780 #define CFMULTILUNDEV 0x0800
0781 #define CFWBCACHEENB 0x4000
0782 #define CFWBCACHENOP 0xc000
0783
0784
0785
0786
0787 uint16_t bios_control;
0788 #define CFSUPREM 0x0001
0789 #define CFSUPREMB 0x0002
0790 #define CFBIOSEN 0x0004
0791 #define CFBIOS_BUSSCAN 0x0008
0792 #define CFSM2DRV 0x0010
0793 #define CFSTPWLEVEL 0x0010
0794 #define CF284XEXTEND 0x0020
0795 #define CFCTRL_A 0x0020
0796 #define CFTERM_MENU 0x0040
0797 #define CFEXTEND 0x0080
0798 #define CFSCAMEN 0x0100
0799 #define CFMSG_LEVEL 0x0600
0800 #define CFMSG_VERBOSE 0x0000
0801 #define CFMSG_SILENT 0x0200
0802 #define CFMSG_DIAG 0x0400
0803 #define CFBOOTCD 0x0800
0804
0805
0806
0807
0808
0809 uint16_t adapter_control;
0810 #define CFAUTOTERM 0x0001
0811 #define CFULTRAEN 0x0002
0812 #define CF284XSELTO 0x0003
0813 #define CF284XFIFO 0x000C
0814 #define CFSTERM 0x0004
0815 #define CFWSTERM 0x0008
0816 #define CFSPARITY 0x0010
0817 #define CF284XSTERM 0x0020
0818 #define CFMULTILUN 0x0020
0819 #define CFRESETB 0x0040
0820 #define CFCLUSTERENB 0x0080
0821 #define CFBOOTCHAN 0x0300
0822 #define CFBOOTCHANSHIFT 8
0823 #define CFSEAUTOTERM 0x0400
0824 #define CFSELOWTERM 0x0800
0825 #define CFSEHIGHTERM 0x1000
0826 #define CFENABLEDV 0x4000
0827
0828
0829
0830
0831 uint16_t brtime_id;
0832 #define CFSCSIID 0x000f
0833
0834 #define CFBRTIME 0xff00
0835
0836
0837
0838
0839 uint16_t max_targets;
0840 #define CFMAXTARG 0x00ff
0841 #define CFBOOTLUN 0x0f00
0842 #define CFBOOTID 0xf000
0843 uint16_t res_1[10];
0844 uint16_t signature;
0845 #define CFSIGNATURE 0x250
0846 #define CFSIGNATURE2 0x300
0847 uint16_t checksum;
0848 };
0849
0850
0851 typedef enum {
0852 MSG_TYPE_NONE = 0x00,
0853 MSG_TYPE_INITIATOR_MSGOUT = 0x01,
0854 MSG_TYPE_INITIATOR_MSGIN = 0x02,
0855 MSG_TYPE_TARGET_MSGOUT = 0x03,
0856 MSG_TYPE_TARGET_MSGIN = 0x04
0857 } ahc_msg_type;
0858
0859 typedef enum {
0860 MSGLOOP_IN_PROG,
0861 MSGLOOP_MSGCOMPLETE,
0862 MSGLOOP_TERMINATED
0863 } msg_loop_stat;
0864
0865
0866 TAILQ_HEAD(scb_tailq, scb);
0867
0868 struct ahc_aic7770_softc {
0869
0870
0871
0872 uint8_t busspd;
0873 uint8_t bustime;
0874 };
0875
0876 struct ahc_pci_softc {
0877
0878
0879
0880 uint32_t devconfig;
0881 uint16_t targcrccnt;
0882 uint8_t command;
0883 uint8_t csize_lattime;
0884 uint8_t optionmode;
0885 uint8_t crccontrol1;
0886 uint8_t dscommand0;
0887 uint8_t dspcistatus;
0888 uint8_t scbbaddr;
0889 uint8_t dff_thrsh;
0890 };
0891
0892 union ahc_bus_softc {
0893 struct ahc_aic7770_softc aic7770_softc;
0894 struct ahc_pci_softc pci_softc;
0895 };
0896
0897 typedef void (*ahc_bus_intr_t)(struct ahc_softc *);
0898 typedef int (*ahc_bus_chip_init_t)(struct ahc_softc *);
0899 typedef void ahc_callback_t (void *);
0900
0901 struct ahc_softc {
0902 bus_space_tag_t tag;
0903 bus_space_handle_t bsh;
0904 struct scb_data *scb_data;
0905
0906 struct scb *next_queued_scb;
0907
0908
0909
0910
0911 BSD_LIST_HEAD(, scb) pending_scbs;
0912
0913
0914
0915
0916
0917
0918
0919 u_int untagged_queue_lock;
0920
0921
0922
0923
0924
0925
0926
0927
0928 struct scb_tailq untagged_queues[AHC_NUM_TARGETS];
0929
0930
0931
0932
0933 union ahc_bus_softc bus_softc;
0934
0935
0936
0937
0938 struct ahc_platform_data *platform_data;
0939
0940
0941
0942
0943 ahc_dev_softc_t dev_softc;
0944 struct device *dev;
0945
0946
0947
0948
0949 ahc_bus_intr_t bus_intr;
0950
0951
0952
0953
0954
0955 ahc_bus_chip_init_t bus_chip_init;
0956
0957
0958
0959
0960
0961
0962
0963 struct ahc_tmode_tstate *enabled_targets[AHC_NUM_TARGETS];
0964
0965
0966
0967
0968
0969 struct ahc_tmode_lstate *black_hole;
0970
0971
0972
0973
0974
0975 struct ahc_tmode_lstate *pending_device;
0976
0977
0978
0979
0980 ahc_chip chip;
0981 ahc_feature features;
0982 ahc_bug bugs;
0983 ahc_flag flags;
0984 struct seeprom_config *seep_config;
0985
0986
0987 uint8_t unpause;
0988 uint8_t pause;
0989
0990
0991 uint8_t qoutfifonext;
0992 uint8_t qinfifonext;
0993 uint8_t *qoutfifo;
0994 uint8_t *qinfifo;
0995
0996
0997 struct cs *critical_sections;
0998 u_int num_critical_sections;
0999
1000
1001 char channel;
1002 char channel_b;
1003
1004
1005 uint8_t our_id;
1006 uint8_t our_id_b;
1007
1008
1009
1010
1011 int unsolicited_ints;
1012
1013
1014
1015
1016 struct target_cmd *targetcmds;
1017 uint8_t tqinfifonext;
1018
1019
1020
1021
1022 uint8_t seqctl;
1023
1024
1025
1026
1027 uint8_t send_msg_perror;
1028 ahc_msg_type msg_type;
1029 uint8_t msgout_buf[12];
1030 uint8_t msgin_buf[12];
1031 u_int msgout_len;
1032 u_int msgout_index;
1033 u_int msgin_index;
1034
1035
1036
1037
1038
1039 bus_dma_tag_t parent_dmat;
1040 bus_dma_tag_t shared_data_dmat;
1041 bus_dmamap_t shared_data_dmamap;
1042 dma_addr_t shared_data_busaddr;
1043
1044
1045
1046
1047
1048
1049 dma_addr_t dma_bug_buf;
1050
1051
1052 u_int enabled_luns;
1053
1054
1055 u_int init_level;
1056
1057
1058 u_int pci_cachesize;
1059
1060
1061
1062
1063
1064
1065 u_int pci_target_perr_count;
1066 #define AHC_PCI_TARGET_PERR_THRESH 10
1067
1068
1069 u_int instruction_ram_size;
1070
1071
1072 const char *description;
1073 char *name;
1074 int unit;
1075
1076
1077 int seltime;
1078 int seltime_b;
1079
1080 uint16_t user_discenable;
1081 uint16_t user_tagenable;
1082 };
1083
1084
1085 typedef enum {
1086 ROLE_UNKNOWN,
1087 ROLE_INITIATOR,
1088 ROLE_TARGET
1089 } role_t;
1090
1091 struct ahc_devinfo {
1092 int our_scsiid;
1093 int target_offset;
1094 uint16_t target_mask;
1095 u_int target;
1096 u_int lun;
1097 char channel;
1098 role_t role;
1099
1100
1101
1102 };
1103
1104
1105 typedef int (ahc_device_setup_t)(struct ahc_softc *);
1106
1107 struct ahc_pci_identity {
1108 uint64_t full_id;
1109 uint64_t id_mask;
1110 const char *name;
1111 ahc_device_setup_t *setup;
1112 };
1113
1114
1115 struct aic7770_identity {
1116 uint32_t full_id;
1117 uint32_t id_mask;
1118 const char *name;
1119 ahc_device_setup_t *setup;
1120 };
1121 extern struct aic7770_identity aic7770_ident_table[];
1122 extern const int ahc_num_aic7770_devs;
1123
1124 #define AHC_EISA_SLOT_OFFSET 0xc00
1125 #define AHC_EISA_IOSIZE 0x100
1126
1127
1128
1129
1130
1131 const struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t);
1132 int ahc_pci_config(struct ahc_softc *,
1133 const struct ahc_pci_identity *);
1134 int ahc_pci_test_register_access(struct ahc_softc *);
1135 void __maybe_unused ahc_pci_resume(struct ahc_softc *ahc);
1136
1137
1138 struct aic7770_identity *aic7770_find_device(uint32_t);
1139 int aic7770_config(struct ahc_softc *ahc,
1140 struct aic7770_identity *,
1141 u_int port);
1142
1143
1144 int ahc_probe_scbs(struct ahc_softc *);
1145 void ahc_qinfifo_requeue_tail(struct ahc_softc *ahc,
1146 struct scb *scb);
1147 int ahc_match_scb(struct ahc_softc *ahc, struct scb *scb,
1148 int target, char channel, int lun,
1149 u_int tag, role_t role);
1150
1151
1152 struct ahc_softc *ahc_alloc(void *platform_arg, char *name);
1153 int ahc_softc_init(struct ahc_softc *);
1154 void ahc_controller_info(struct ahc_softc *ahc, char *buf);
1155 int ahc_chip_init(struct ahc_softc *ahc);
1156 int ahc_init(struct ahc_softc *ahc);
1157 void ahc_intr_enable(struct ahc_softc *ahc, int enable);
1158 void ahc_pause_and_flushwork(struct ahc_softc *ahc);
1159 int __maybe_unused ahc_suspend(struct ahc_softc *ahc);
1160 int __maybe_unused ahc_resume(struct ahc_softc *ahc);
1161 void ahc_set_unit(struct ahc_softc *, int);
1162 void ahc_set_name(struct ahc_softc *, char *);
1163 void ahc_free(struct ahc_softc *ahc);
1164 int ahc_reset(struct ahc_softc *ahc, int reinit);
1165
1166
1167 typedef enum {
1168 SEARCH_COMPLETE,
1169 SEARCH_COUNT,
1170 SEARCH_REMOVE
1171 } ahc_search_action;
1172 int ahc_search_qinfifo(struct ahc_softc *ahc, int target,
1173 char channel, int lun, u_int tag,
1174 role_t role, uint32_t status,
1175 ahc_search_action action);
1176 int ahc_search_untagged_queues(struct ahc_softc *ahc,
1177 ahc_io_ctx_t ctx,
1178 int target, char channel,
1179 int lun, uint32_t status,
1180 ahc_search_action action);
1181 int ahc_search_disc_list(struct ahc_softc *ahc, int target,
1182 char channel, int lun, u_int tag,
1183 int stop_on_first, int remove,
1184 int save_state);
1185 int ahc_reset_channel(struct ahc_softc *ahc, char channel,
1186 int initiate_reset);
1187
1188
1189 void ahc_compile_devinfo(struct ahc_devinfo *devinfo,
1190 u_int our_id, u_int target,
1191 u_int lun, char channel,
1192 role_t role);
1193
1194 const struct ahc_syncrate* ahc_find_syncrate(struct ahc_softc *ahc, u_int *period,
1195 u_int *ppr_options, u_int maxsync);
1196 u_int ahc_find_period(struct ahc_softc *ahc,
1197 u_int scsirate, u_int maxsync);
1198
1199
1200
1201
1202 typedef enum {
1203 AHC_NEG_TO_GOAL,
1204 AHC_NEG_IF_NON_ASYNC,
1205 AHC_NEG_ALWAYS
1206 } ahc_neg_type;
1207 int ahc_update_neg_request(struct ahc_softc*,
1208 struct ahc_devinfo*,
1209 struct ahc_tmode_tstate*,
1210 struct ahc_initiator_tinfo*,
1211 ahc_neg_type);
1212 void ahc_set_width(struct ahc_softc *ahc,
1213 struct ahc_devinfo *devinfo,
1214 u_int width, u_int type, int paused);
1215 void ahc_set_syncrate(struct ahc_softc *ahc,
1216 struct ahc_devinfo *devinfo,
1217 const struct ahc_syncrate *syncrate,
1218 u_int period, u_int offset,
1219 u_int ppr_options,
1220 u_int type, int paused);
1221 typedef enum {
1222 AHC_QUEUE_NONE,
1223 AHC_QUEUE_BASIC,
1224 AHC_QUEUE_TAGGED
1225 } ahc_queue_alg;
1226
1227
1228 #ifdef AHC_TARGET_MODE
1229 void ahc_send_lstate_events(struct ahc_softc *,
1230 struct ahc_tmode_lstate *);
1231 void ahc_handle_en_lun(struct ahc_softc *ahc,
1232 struct cam_sim *sim, union ccb *ccb);
1233 cam_status ahc_find_tmode_devs(struct ahc_softc *ahc,
1234 struct cam_sim *sim, union ccb *ccb,
1235 struct ahc_tmode_tstate **tstate,
1236 struct ahc_tmode_lstate **lstate,
1237 int notfound_failure);
1238 #ifndef AHC_TMODE_ENABLE
1239 #define AHC_TMODE_ENABLE 0
1240 #endif
1241 #endif
1242
1243 #ifdef AHC_DEBUG
1244 extern uint32_t ahc_debug;
1245 #define AHC_SHOW_MISC 0x0001
1246 #define AHC_SHOW_SENSE 0x0002
1247 #define AHC_DUMP_SEEPROM 0x0004
1248 #define AHC_SHOW_TERMCTL 0x0008
1249 #define AHC_SHOW_MEMORY 0x0010
1250 #define AHC_SHOW_MESSAGES 0x0020
1251 #define AHC_SHOW_DV 0x0040
1252 #define AHC_SHOW_SELTO 0x0080
1253 #define AHC_SHOW_QFULL 0x0200
1254 #define AHC_SHOW_QUEUE 0x0400
1255 #define AHC_SHOW_TQIN 0x0800
1256 #define AHC_SHOW_MASKED_ERRORS 0x1000
1257 #define AHC_DEBUG_SEQUENCER 0x2000
1258 #endif
1259 void ahc_print_devinfo(struct ahc_softc *ahc,
1260 struct ahc_devinfo *dev);
1261 void ahc_dump_card_state(struct ahc_softc *ahc);
1262 int ahc_print_register(const ahc_reg_parse_entry_t *table,
1263 u_int num_entries,
1264 const char *name,
1265 u_int address,
1266 u_int value,
1267 u_int *cur_column,
1268 u_int wrap_point);
1269
1270 int ahc_acquire_seeprom(struct ahc_softc *ahc,
1271 struct seeprom_descriptor *sd);
1272 void ahc_release_seeprom(struct seeprom_descriptor *sd);
1273 #endif