1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#ifndef _AIC7XXX_H_
46#define _AIC7XXX_H_
47
48
49#include "aic7xxx_reg.h"
50
51
52struct ahc_platform_data;
53struct scb_platform_data;
54struct seeprom_descriptor;
55
56
57#ifndef TRUE
58#define TRUE 1
59#endif
60#ifndef FALSE
61#define FALSE 0
62#endif
63
64#define ALL_CHANNELS '\0'
65#define ALL_TARGETS_MASK 0xFFFF
66#define INITIATOR_WILDCARD (~0)
67
68#define SCSIID_TARGET(ahc, scsiid) \
69 (((scsiid) & ((((ahc)->features & AHC_TWIN) != 0) ? TWIN_TID : TID)) \
70 >> TID_SHIFT)
71#define SCSIID_OUR_ID(scsiid) \
72 ((scsiid) & OID)
73#define SCSIID_CHANNEL(ahc, scsiid) \
74 ((((ahc)->features & AHC_TWIN) != 0) \
75 ? ((((scsiid) & TWIN_CHNLB) != 0) ? 'B' : 'A') \
76 : 'A')
77#define SCB_IS_SCSIBUS_B(ahc, scb) \
78 (SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid) == 'B')
79#define SCB_GET_OUR_ID(scb) \
80 SCSIID_OUR_ID((scb)->hscb->scsiid)
81#define SCB_GET_TARGET(ahc, scb) \
82 SCSIID_TARGET((ahc), (scb)->hscb->scsiid)
83#define SCB_GET_CHANNEL(ahc, scb) \
84 SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid)
85#define SCB_GET_LUN(scb) \
86 ((scb)->hscb->lun & LID)
87#define SCB_GET_TARGET_OFFSET(ahc, scb) \
88 (SCB_GET_TARGET(ahc, scb) + (SCB_IS_SCSIBUS_B(ahc, scb) ? 8 : 0))
89#define SCB_GET_TARGET_MASK(ahc, scb) \
90 (0x01 << (SCB_GET_TARGET_OFFSET(ahc, scb)))
91#ifdef AHC_DEBUG
92#define SCB_IS_SILENT(scb) \
93 ((ahc_debug & AHC_SHOW_MASKED_ERRORS) == 0 \
94 && (((scb)->flags & SCB_SILENT) != 0))
95#else
96#define SCB_IS_SILENT(scb) \
97 (((scb)->flags & SCB_SILENT) != 0)
98#endif
99#define TCL_TARGET_OFFSET(tcl) \
100 ((((tcl) >> 4) & TID) >> 4)
101#define TCL_LUN(tcl) \
102 (tcl & (AHC_NUM_LUNS - 1))
103#define BUILD_TCL(scsiid, lun) \
104 ((lun) | (((scsiid) & TID) << 4))
105
106#ifndef AHC_TARGET_MODE
107#undef AHC_TMODE_ENABLE
108#define AHC_TMODE_ENABLE 0
109#endif
110
111
112
113
114
115#define AHC_NUM_TARGETS 16
116
117
118
119
120
121
122
123#define AHC_NUM_LUNS 64
124
125
126
127
128#define AHC_MAXTRANSFER_SIZE 0x00ffffff
129
130
131
132
133
134
135#define AHC_SCB_MAX 255
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155#define AHC_MAX_QUEUE 253
156
157
158
159
160
161
162#define AHC_SCB_MAX_ALLOC (AHC_MAX_QUEUE+1)
163
164
165
166
167
168
169#define AHC_TMODE_CMDS 256
170
171
172#define AHC_BUSRESET_DELAY 25
173
174
175
176
177
178
179typedef enum {
180 AHC_NONE = 0x0000,
181 AHC_CHIPID_MASK = 0x00FF,
182 AHC_AIC7770 = 0x0001,
183 AHC_AIC7850 = 0x0002,
184 AHC_AIC7855 = 0x0003,
185 AHC_AIC7859 = 0x0004,
186 AHC_AIC7860 = 0x0005,
187 AHC_AIC7870 = 0x0006,
188 AHC_AIC7880 = 0x0007,
189 AHC_AIC7895 = 0x0008,
190 AHC_AIC7895C = 0x0009,
191 AHC_AIC7890 = 0x000a,
192 AHC_AIC7896 = 0x000b,
193 AHC_AIC7892 = 0x000c,
194 AHC_AIC7899 = 0x000d,
195 AHC_VL = 0x0100,
196 AHC_EISA = 0x0200,
197 AHC_PCI = 0x0400,
198 AHC_BUS_MASK = 0x0F00
199} ahc_chip;
200
201
202
203
204typedef enum {
205 AHC_FENONE = 0x00000,
206 AHC_ULTRA = 0x00001,
207 AHC_ULTRA2 = 0x00002,
208 AHC_WIDE = 0x00004,
209 AHC_TWIN = 0x00008,
210 AHC_MORE_SRAM = 0x00010,
211 AHC_CMD_CHAN = 0x00020,
212 AHC_QUEUE_REGS = 0x00040,
213 AHC_SG_PRELOAD = 0x00080,
214 AHC_SPIOCAP = 0x00100,
215 AHC_MULTI_TID = 0x00200,
216 AHC_HS_MAILBOX = 0x00400,
217 AHC_DT = 0x00800,
218 AHC_NEW_TERMCTL = 0x01000,
219 AHC_MULTI_FUNC = 0x02000,
220 AHC_LARGE_SCBS = 0x04000,
221 AHC_AUTORATE = 0x08000,
222 AHC_AUTOPAUSE = 0x10000,
223 AHC_TARGETMODE = 0x20000,
224 AHC_MULTIROLE = 0x40000,
225 AHC_REMOVABLE = 0x80000,
226 AHC_HVD = 0x100000,
227 AHC_AIC7770_FE = AHC_FENONE,
228
229
230
231
232
233
234
235 AHC_AIC7850_FE = AHC_SPIOCAP|AHC_AUTOPAUSE|AHC_TARGETMODE|AHC_ULTRA,
236 AHC_AIC7860_FE = AHC_AIC7850_FE,
237 AHC_AIC7870_FE = AHC_TARGETMODE|AHC_AUTOPAUSE,
238 AHC_AIC7880_FE = AHC_AIC7870_FE|AHC_ULTRA,
239
240
241
242
243
244
245
246
247
248 AHC_AIC7890_FE = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA2
249 |AHC_QUEUE_REGS|AHC_SG_PRELOAD|AHC_MULTI_TID
250 |AHC_HS_MAILBOX|AHC_NEW_TERMCTL|AHC_LARGE_SCBS
251 |AHC_TARGETMODE,
252 AHC_AIC7892_FE = AHC_AIC7890_FE|AHC_DT|AHC_AUTORATE|AHC_AUTOPAUSE,
253 AHC_AIC7895_FE = AHC_AIC7880_FE|AHC_MORE_SRAM|AHC_AUTOPAUSE
254 |AHC_CMD_CHAN|AHC_MULTI_FUNC|AHC_LARGE_SCBS,
255 AHC_AIC7895C_FE = AHC_AIC7895_FE|AHC_MULTI_TID,
256 AHC_AIC7896_FE = AHC_AIC7890_FE|AHC_MULTI_FUNC,
257 AHC_AIC7899_FE = AHC_AIC7892_FE|AHC_MULTI_FUNC
258} ahc_feature;
259
260
261
262
263typedef enum {
264 AHC_BUGNONE = 0x00,
265
266
267
268
269
270 AHC_TMODE_WIDEODD_BUG = 0x01,
271
272
273
274
275
276 AHC_AUTOFLUSH_BUG = 0x02,
277
278
279
280 AHC_CACHETHEN_BUG = 0x04,
281
282
283
284
285 AHC_CACHETHEN_DIS_BUG = 0x08,
286
287
288
289 AHC_PCI_2_1_RETRY_BUG = 0x10,
290
291
292
293
294
295 AHC_PCI_MWI_BUG = 0x20,
296
297
298
299
300
301
302 AHC_SCBCHAN_UPLOAD_BUG = 0x40
303} ahc_bug;
304
305
306
307
308
309
310typedef enum {
311 AHC_FNONE = 0x000,
312 AHC_PRIMARY_CHANNEL = 0x003,
313
314
315
316 AHC_USEDEFAULTS = 0x004,
317
318
319
320
321
322 AHC_SEQUENCER_DEBUG = 0x008,
323 AHC_SHARED_SRAM = 0x010,
324 AHC_LARGE_SEEPROM = 0x020,
325 AHC_RESET_BUS_A = 0x040,
326 AHC_RESET_BUS_B = 0x080,
327 AHC_EXTENDED_TRANS_A = 0x100,
328 AHC_EXTENDED_TRANS_B = 0x200,
329 AHC_TERM_ENB_A = 0x400,
330 AHC_TERM_ENB_B = 0x800,
331 AHC_INITIATORROLE = 0x1000,
332
333
334
335 AHC_TARGETROLE = 0x2000,
336
337
338
339 AHC_NEWEEPROM_FMT = 0x4000,
340 AHC_TQINFIFO_BLOCKED = 0x10000,
341 AHC_INT50_SPEEDFLEX = 0x20000,
342
343
344
345 AHC_SCB_BTT = 0x40000,
346
347
348
349
350 AHC_BIOS_ENABLED = 0x80000,
351 AHC_ALL_INTERRUPTS = 0x100000,
352 AHC_PAGESCBS = 0x400000,
353 AHC_EDGE_INTERRUPT = 0x800000,
354 AHC_39BIT_ADDRESSING = 0x1000000,
355 AHC_LSCBS_ENABLED = 0x2000000,
356 AHC_SCB_CONFIG_USED = 0x4000000,
357 AHC_NO_BIOS_INIT = 0x8000000,
358 AHC_DISABLE_PCI_PERR = 0x10000000,
359 AHC_HAS_TERM_LOGIC = 0x20000000
360} ahc_flag;
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386struct status_pkt {
387 uint32_t residual_datacnt;
388 uint32_t residual_sg_ptr;
389 uint8_t scsi_status;
390};
391
392
393
394
395struct target_data {
396 uint32_t residual_datacnt;
397 uint32_t residual_sg_ptr;
398 uint8_t scsi_status;
399 uint8_t target_phases;
400 uint8_t data_phase;
401 uint8_t initiator_tag;
402};
403
404struct hardware_scb {
405 union {
406
407
408
409
410
411
412 uint8_t cdb[12];
413 uint32_t cdb_ptr;
414 struct status_pkt status;
415 struct target_data tdata;
416 } shared_data;
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454 uint32_t dataptr;
455 uint32_t datacnt;
456
457
458
459
460 uint32_t sgptr;
461#define SG_PTR_MASK 0xFFFFFFF8
462 uint8_t control;
463 uint8_t scsiid;
464 uint8_t lun;
465 uint8_t tag;
466
467
468
469 uint8_t cdb_len;
470 uint8_t scsirate;
471 uint8_t scsioffset;
472 uint8_t next;
473
474
475
476
477
478 uint8_t cdb32[32];
479
480
481
482
483
484
485
486
487};
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504struct ahc_dma_seg {
505 uint32_t addr;
506 uint32_t len;
507#define AHC_DMA_LAST_SEG 0x80000000
508#define AHC_SG_HIGH_ADDR_MASK 0x7F000000
509#define AHC_SG_LEN_MASK 0x00FFFFFF
510};
511
512struct sg_map_node {
513 bus_dmamap_t sg_dmamap;
514 dma_addr_t sg_physaddr;
515 struct ahc_dma_seg* sg_vaddr;
516 SLIST_ENTRY(sg_map_node) links;
517};
518
519
520
521
522typedef enum {
523 SCB_FREE = 0x0000,
524 SCB_OTHERTCL_TIMEOUT = 0x0002,
525
526
527
528
529
530
531
532 SCB_DEVICE_RESET = 0x0004,
533 SCB_SENSE = 0x0008,
534 SCB_CDB32_PTR = 0x0010,
535 SCB_RECOVERY_SCB = 0x0020,
536 SCB_AUTO_NEGOTIATE = 0x0040,
537 SCB_NEGOTIATE = 0x0080,
538 SCB_ABORT = 0x0100,
539 SCB_UNTAGGEDQ = 0x0200,
540 SCB_ACTIVE = 0x0400,
541 SCB_TARGET_IMMEDIATE = 0x0800,
542 SCB_TRANSMISSION_ERROR = 0x1000,
543
544
545
546
547
548
549
550
551
552 SCB_TARGET_SCB = 0x2000,
553 SCB_SILENT = 0x4000
554
555
556
557
558
559} scb_flag;
560
561struct scb {
562 struct hardware_scb *hscb;
563 union {
564 SLIST_ENTRY(scb) sle;
565 TAILQ_ENTRY(scb) tqe;
566 } links;
567 LIST_ENTRY(scb) pending_links;
568 ahc_io_ctx_t io_ctx;
569 struct ahc_softc *ahc_softc;
570 scb_flag flags;
571#ifndef __linux__
572 bus_dmamap_t dmamap;
573#endif
574 struct scb_platform_data *platform_data;
575 struct sg_map_node *sg_map;
576 struct ahc_dma_seg *sg_list;
577 dma_addr_t sg_list_phys;
578 u_int sg_count;
579};
580
581struct scb_data {
582 SLIST_HEAD(, scb) free_scbs;
583
584
585
586 struct scb *scbindex[256];
587
588
589
590
591
592
593
594
595 struct hardware_scb *hscbs;
596 struct scb *scbarray;
597 struct scsi_sense_data *sense;
598
599
600
601
602 bus_dma_tag_t hscb_dmat;
603 bus_dmamap_t hscb_dmamap;
604 dma_addr_t hscb_busaddr;
605 bus_dma_tag_t sense_dmat;
606 bus_dmamap_t sense_dmamap;
607 dma_addr_t sense_busaddr;
608 bus_dma_tag_t sg_dmat;
609 SLIST_HEAD(, sg_map_node) sg_maps;
610 uint8_t numscbs;
611 uint8_t maxhscbs;
612 uint8_t init_level;
613
614
615
616};
617
618
619
620
621
622
623struct target_cmd {
624 uint8_t scsiid;
625 uint8_t identify;
626 uint8_t bytes[22];
627
628
629
630
631 uint8_t cmd_valid;
632
633
634
635
636
637
638
639
640
641
642 uint8_t pad[7];
643};
644
645
646
647
648
649#define AHC_TMODE_EVENT_BUFFER_SIZE 8
650struct ahc_tmode_event {
651 uint8_t initiator_id;
652 uint8_t event_type;
653#define EVENT_TYPE_BUS_RESET 0xFF
654 uint8_t event_arg;
655};
656
657
658
659
660
661
662
663
664#ifdef AHC_TARGET_MODE
665struct ahc_tmode_lstate {
666 struct cam_path *path;
667 struct ccb_hdr_slist accept_tios;
668 struct ccb_hdr_slist immed_notifies;
669 struct ahc_tmode_event event_buffer[AHC_TMODE_EVENT_BUFFER_SIZE];
670 uint8_t event_r_idx;
671 uint8_t event_w_idx;
672};
673#else
674struct ahc_tmode_lstate;
675#endif
676
677
678#define AHC_TRANS_CUR 0x01
679#define AHC_TRANS_ACTIVE 0x03
680#define AHC_TRANS_GOAL 0x04
681#define AHC_TRANS_USER 0x08
682
683#define AHC_WIDTH_UNKNOWN 0xFF
684#define AHC_PERIOD_UNKNOWN 0xFF
685#define AHC_OFFSET_UNKNOWN 0xFF
686#define AHC_PPR_OPTS_UNKNOWN 0xFF
687
688
689
690
691struct ahc_transinfo {
692 uint8_t protocol_version;
693 uint8_t transport_version;
694 uint8_t width;
695 uint8_t period;
696 uint8_t offset;
697 uint8_t ppr_options;
698};
699
700
701
702struct ahc_initiator_tinfo {
703 uint8_t scsirate;
704 struct ahc_transinfo curr;
705 struct ahc_transinfo goal;
706 struct ahc_transinfo user;
707};
708
709
710
711
712
713
714
715
716struct ahc_tmode_tstate {
717 struct ahc_tmode_lstate* enabled_luns[AHC_NUM_LUNS];
718 struct ahc_initiator_tinfo transinfo[AHC_NUM_TARGETS];
719
720
721
722
723 uint16_t auto_negotiate;
724 uint16_t ultraenb;
725 uint16_t discenable;
726 uint16_t tagenable;
727};
728
729
730
731
732struct ahc_syncrate {
733 u_int sxfr_u2;
734 u_int sxfr;
735#define ULTRA_SXFR 0x100
736#define ST_SXFR 0x010
737#define DT_SXFR 0x040
738 uint8_t period;
739 const char *rate;
740};
741
742
743#define AHC_ASYNC_XFER_PERIOD 0x45
744#define AHC_ULTRA2_XFER_PERIOD 0x0a
745
746
747
748
749#define AHC_SYNCRATE_DT 0
750#define AHC_SYNCRATE_ULTRA2 1
751#define AHC_SYNCRATE_ULTRA 3
752#define AHC_SYNCRATE_FAST 6
753#define AHC_SYNCRATE_MAX AHC_SYNCRATE_DT
754#define AHC_SYNCRATE_MIN 13
755
756
757
758
759
760
761struct ahc_phase_table_entry {
762 uint8_t phase;
763 uint8_t mesg_out;
764 char *phasemsg;
765};
766
767
768
769struct seeprom_config {
770
771
772
773 uint16_t device_flags[16];
774#define CFXFER 0x0007
775#define CFSYNCH 0x0008
776#define CFDISC 0x0010
777#define CFWIDEB 0x0020
778#define CFSYNCHISULTRA 0x0040
779#define CFSYNCSINGLE 0x0080
780#define CFSTART 0x0100
781#define CFINCBIOS 0x0200
782#define CFRNFOUND 0x0400
783#define CFMULTILUNDEV 0x0800
784#define CFWBCACHEENB 0x4000
785#define CFWBCACHENOP 0xc000
786
787
788
789
790 uint16_t bios_control;
791#define CFSUPREM 0x0001
792#define CFSUPREMB 0x0002
793#define CFBIOSEN 0x0004
794#define CFBIOS_BUSSCAN 0x0008
795#define CFSM2DRV 0x0010
796#define CFSTPWLEVEL 0x0010
797#define CF284XEXTEND 0x0020
798#define CFCTRL_A 0x0020
799#define CFTERM_MENU 0x0040
800#define CFEXTEND 0x0080
801#define CFSCAMEN 0x0100
802#define CFMSG_LEVEL 0x0600
803#define CFMSG_VERBOSE 0x0000
804#define CFMSG_SILENT 0x0200
805#define CFMSG_DIAG 0x0400
806#define CFBOOTCD 0x0800
807
808
809
810
811
812 uint16_t adapter_control;
813#define CFAUTOTERM 0x0001
814#define CFULTRAEN 0x0002
815#define CF284XSELTO 0x0003
816#define CF284XFIFO 0x000C
817#define CFSTERM 0x0004
818#define CFWSTERM 0x0008
819#define CFSPARITY 0x0010
820#define CF284XSTERM 0x0020
821#define CFMULTILUN 0x0020
822#define CFRESETB 0x0040
823#define CFCLUSTERENB 0x0080
824#define CFBOOTCHAN 0x0300
825#define CFBOOTCHANSHIFT 8
826#define CFSEAUTOTERM 0x0400
827#define CFSELOWTERM 0x0800
828#define CFSEHIGHTERM 0x1000
829#define CFENABLEDV 0x4000
830
831
832
833
834 uint16_t brtime_id;
835#define CFSCSIID 0x000f
836
837#define CFBRTIME 0xff00
838
839
840
841
842 uint16_t max_targets;
843#define CFMAXTARG 0x00ff
844#define CFBOOTLUN 0x0f00
845#define CFBOOTID 0xf000
846 uint16_t res_1[10];
847 uint16_t signature;
848#define CFSIGNATURE 0x250
849#define CFSIGNATURE2 0x300
850 uint16_t checksum;
851};
852
853
854typedef enum {
855 MSG_TYPE_NONE = 0x00,
856 MSG_TYPE_INITIATOR_MSGOUT = 0x01,
857 MSG_TYPE_INITIATOR_MSGIN = 0x02,
858 MSG_TYPE_TARGET_MSGOUT = 0x03,
859 MSG_TYPE_TARGET_MSGIN = 0x04
860} ahc_msg_type;
861
862typedef enum {
863 MSGLOOP_IN_PROG,
864 MSGLOOP_MSGCOMPLETE,
865 MSGLOOP_TERMINATED
866} msg_loop_stat;
867
868
869TAILQ_HEAD(scb_tailq, scb);
870
871struct ahc_aic7770_softc {
872
873
874
875 uint8_t busspd;
876 uint8_t bustime;
877};
878
879struct ahc_pci_softc {
880
881
882
883 uint32_t devconfig;
884 uint16_t targcrccnt;
885 uint8_t command;
886 uint8_t csize_lattime;
887 uint8_t optionmode;
888 uint8_t crccontrol1;
889 uint8_t dscommand0;
890 uint8_t dspcistatus;
891 uint8_t scbbaddr;
892 uint8_t dff_thrsh;
893};
894
895union ahc_bus_softc {
896 struct ahc_aic7770_softc aic7770_softc;
897 struct ahc_pci_softc pci_softc;
898};
899
900typedef void (*ahc_bus_intr_t)(struct ahc_softc *);
901typedef int (*ahc_bus_chip_init_t)(struct ahc_softc *);
902typedef int (*ahc_bus_suspend_t)(struct ahc_softc *);
903typedef int (*ahc_bus_resume_t)(struct ahc_softc *);
904typedef void ahc_callback_t (void *);
905
906struct ahc_softc {
907 bus_space_tag_t tag;
908 bus_space_handle_t bsh;
909#ifndef __linux__
910 bus_dma_tag_t buffer_dmat;
911#endif
912 struct scb_data *scb_data;
913
914 struct scb *next_queued_scb;
915
916
917
918
919 BSD_LIST_HEAD(, scb) pending_scbs;
920
921
922
923
924
925
926
927 u_int untagged_queue_lock;
928
929
930
931
932
933
934
935
936 struct scb_tailq untagged_queues[AHC_NUM_TARGETS];
937
938
939
940
941 union ahc_bus_softc bus_softc;
942
943
944
945
946 struct ahc_platform_data *platform_data;
947
948
949
950
951 ahc_dev_softc_t dev_softc;
952
953
954
955
956 ahc_bus_intr_t bus_intr;
957
958
959
960
961
962 ahc_bus_chip_init_t bus_chip_init;
963
964
965
966
967
968
969
970 struct ahc_tmode_tstate *enabled_targets[AHC_NUM_TARGETS];
971
972
973
974
975
976 struct ahc_tmode_lstate *black_hole;
977
978
979
980
981
982 struct ahc_tmode_lstate *pending_device;
983
984
985
986
987 ahc_chip chip;
988 ahc_feature features;
989 ahc_bug bugs;
990 ahc_flag flags;
991 struct seeprom_config *seep_config;
992
993
994 uint8_t unpause;
995 uint8_t pause;
996
997
998 uint8_t qoutfifonext;
999 uint8_t qinfifonext;
1000 uint8_t *qoutfifo;
1001 uint8_t *qinfifo;
1002
1003
1004 struct cs *critical_sections;
1005 u_int num_critical_sections;
1006
1007
1008 char channel;
1009 char channel_b;
1010
1011
1012 uint8_t our_id;
1013 uint8_t our_id_b;
1014
1015
1016
1017
1018 int unsolicited_ints;
1019
1020
1021
1022
1023 struct target_cmd *targetcmds;
1024 uint8_t tqinfifonext;
1025
1026
1027
1028
1029 uint8_t seqctl;
1030
1031
1032
1033
1034 uint8_t send_msg_perror;
1035 ahc_msg_type msg_type;
1036 uint8_t msgout_buf[12];
1037 uint8_t msgin_buf[12];
1038 u_int msgout_len;
1039 u_int msgout_index;
1040 u_int msgin_index;
1041
1042
1043
1044
1045
1046 bus_dma_tag_t parent_dmat;
1047 bus_dma_tag_t shared_data_dmat;
1048 bus_dmamap_t shared_data_dmamap;
1049 dma_addr_t shared_data_busaddr;
1050
1051
1052
1053
1054
1055
1056 dma_addr_t dma_bug_buf;
1057
1058
1059 u_int enabled_luns;
1060
1061
1062 u_int init_level;
1063
1064
1065 u_int pci_cachesize;
1066
1067
1068
1069
1070
1071
1072 u_int pci_target_perr_count;
1073#define AHC_PCI_TARGET_PERR_THRESH 10
1074
1075
1076 u_int instruction_ram_size;
1077
1078
1079 const char *description;
1080 char *name;
1081 int unit;
1082
1083
1084 int seltime;
1085 int seltime_b;
1086
1087 uint16_t user_discenable;
1088 uint16_t user_tagenable;
1089};
1090
1091
1092typedef enum {
1093 ROLE_UNKNOWN,
1094 ROLE_INITIATOR,
1095 ROLE_TARGET
1096} role_t;
1097
1098struct ahc_devinfo {
1099 int our_scsiid;
1100 int target_offset;
1101 uint16_t target_mask;
1102 u_int target;
1103 u_int lun;
1104 char channel;
1105 role_t role;
1106
1107
1108
1109};
1110
1111
1112typedef int (ahc_device_setup_t)(struct ahc_softc *);
1113
1114struct ahc_pci_identity {
1115 uint64_t full_id;
1116 uint64_t id_mask;
1117 const char *name;
1118 ahc_device_setup_t *setup;
1119};
1120
1121
1122struct aic7770_identity {
1123 uint32_t full_id;
1124 uint32_t id_mask;
1125 const char *name;
1126 ahc_device_setup_t *setup;
1127};
1128extern struct aic7770_identity aic7770_ident_table[];
1129extern const int ahc_num_aic7770_devs;
1130
1131#define AHC_EISA_SLOT_OFFSET 0xc00
1132#define AHC_EISA_IOSIZE 0x100
1133
1134
1135
1136
1137
1138const struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t);
1139int ahc_pci_config(struct ahc_softc *,
1140 const struct ahc_pci_identity *);
1141int ahc_pci_test_register_access(struct ahc_softc *);
1142#ifdef CONFIG_PM
1143void ahc_pci_resume(struct ahc_softc *ahc);
1144#endif
1145
1146
1147struct aic7770_identity *aic7770_find_device(uint32_t);
1148int aic7770_config(struct ahc_softc *ahc,
1149 struct aic7770_identity *,
1150 u_int port);
1151
1152
1153int ahc_probe_scbs(struct ahc_softc *);
1154void ahc_qinfifo_requeue_tail(struct ahc_softc *ahc,
1155 struct scb *scb);
1156int ahc_match_scb(struct ahc_softc *ahc, struct scb *scb,
1157 int target, char channel, int lun,
1158 u_int tag, role_t role);
1159
1160
1161struct ahc_softc *ahc_alloc(void *platform_arg, char *name);
1162int ahc_softc_init(struct ahc_softc *);
1163void ahc_controller_info(struct ahc_softc *ahc, char *buf);
1164int ahc_chip_init(struct ahc_softc *ahc);
1165int ahc_init(struct ahc_softc *ahc);
1166void ahc_intr_enable(struct ahc_softc *ahc, int enable);
1167void ahc_pause_and_flushwork(struct ahc_softc *ahc);
1168#ifdef CONFIG_PM
1169int ahc_suspend(struct ahc_softc *ahc);
1170int ahc_resume(struct ahc_softc *ahc);
1171#endif
1172void ahc_set_unit(struct ahc_softc *, int);
1173void ahc_set_name(struct ahc_softc *, char *);
1174void ahc_free(struct ahc_softc *ahc);
1175int ahc_reset(struct ahc_softc *ahc, int reinit);
1176
1177
1178typedef enum {
1179 SEARCH_COMPLETE,
1180 SEARCH_COUNT,
1181 SEARCH_REMOVE
1182} ahc_search_action;
1183int ahc_search_qinfifo(struct ahc_softc *ahc, int target,
1184 char channel, int lun, u_int tag,
1185 role_t role, uint32_t status,
1186 ahc_search_action action);
1187int ahc_search_untagged_queues(struct ahc_softc *ahc,
1188 ahc_io_ctx_t ctx,
1189 int target, char channel,
1190 int lun, uint32_t status,
1191 ahc_search_action action);
1192int ahc_search_disc_list(struct ahc_softc *ahc, int target,
1193 char channel, int lun, u_int tag,
1194 int stop_on_first, int remove,
1195 int save_state);
1196int ahc_reset_channel(struct ahc_softc *ahc, char channel,
1197 int initiate_reset);
1198
1199
1200void ahc_compile_devinfo(struct ahc_devinfo *devinfo,
1201 u_int our_id, u_int target,
1202 u_int lun, char channel,
1203 role_t role);
1204
1205const struct ahc_syncrate* ahc_find_syncrate(struct ahc_softc *ahc, u_int *period,
1206 u_int *ppr_options, u_int maxsync);
1207u_int ahc_find_period(struct ahc_softc *ahc,
1208 u_int scsirate, u_int maxsync);
1209
1210
1211
1212
1213typedef enum {
1214 AHC_NEG_TO_GOAL,
1215 AHC_NEG_IF_NON_ASYNC,
1216 AHC_NEG_ALWAYS
1217} ahc_neg_type;
1218int ahc_update_neg_request(struct ahc_softc*,
1219 struct ahc_devinfo*,
1220 struct ahc_tmode_tstate*,
1221 struct ahc_initiator_tinfo*,
1222 ahc_neg_type);
1223void ahc_set_width(struct ahc_softc *ahc,
1224 struct ahc_devinfo *devinfo,
1225 u_int width, u_int type, int paused);
1226void ahc_set_syncrate(struct ahc_softc *ahc,
1227 struct ahc_devinfo *devinfo,
1228 const struct ahc_syncrate *syncrate,
1229 u_int period, u_int offset,
1230 u_int ppr_options,
1231 u_int type, int paused);
1232typedef enum {
1233 AHC_QUEUE_NONE,
1234 AHC_QUEUE_BASIC,
1235 AHC_QUEUE_TAGGED
1236} ahc_queue_alg;
1237
1238
1239#ifdef AHC_TARGET_MODE
1240void ahc_send_lstate_events(struct ahc_softc *,
1241 struct ahc_tmode_lstate *);
1242void ahc_handle_en_lun(struct ahc_softc *ahc,
1243 struct cam_sim *sim, union ccb *ccb);
1244cam_status ahc_find_tmode_devs(struct ahc_softc *ahc,
1245 struct cam_sim *sim, union ccb *ccb,
1246 struct ahc_tmode_tstate **tstate,
1247 struct ahc_tmode_lstate **lstate,
1248 int notfound_failure);
1249#ifndef AHC_TMODE_ENABLE
1250#define AHC_TMODE_ENABLE 0
1251#endif
1252#endif
1253
1254#ifdef AHC_DEBUG
1255extern uint32_t ahc_debug;
1256#define AHC_SHOW_MISC 0x0001
1257#define AHC_SHOW_SENSE 0x0002
1258#define AHC_DUMP_SEEPROM 0x0004
1259#define AHC_SHOW_TERMCTL 0x0008
1260#define AHC_SHOW_MEMORY 0x0010
1261#define AHC_SHOW_MESSAGES 0x0020
1262#define AHC_SHOW_DV 0x0040
1263#define AHC_SHOW_SELTO 0x0080
1264#define AHC_SHOW_QFULL 0x0200
1265#define AHC_SHOW_QUEUE 0x0400
1266#define AHC_SHOW_TQIN 0x0800
1267#define AHC_SHOW_MASKED_ERRORS 0x1000
1268#define AHC_DEBUG_SEQUENCER 0x2000
1269#endif
1270void ahc_print_devinfo(struct ahc_softc *ahc,
1271 struct ahc_devinfo *dev);
1272void ahc_dump_card_state(struct ahc_softc *ahc);
1273int ahc_print_register(const ahc_reg_parse_entry_t *table,
1274 u_int num_entries,
1275 const char *name,
1276 u_int address,
1277 u_int value,
1278 u_int *cur_column,
1279 u_int wrap_point);
1280
1281int ahc_acquire_seeprom(struct ahc_softc *ahc,
1282 struct seeprom_descriptor *sd);
1283void ahc_release_seeprom(struct seeprom_descriptor *sd);
1284#endif
1285