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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
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
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
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
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
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
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
|
/*
* Copyright (c) 2013-2014 Qlogic Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* File: qls_hw.h
* Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
*/
#ifndef _QLS_HW_H_
#define _QLS_HW_H_
#define Q8_MAX_NUM_MULTICAST_ADDRS 32
#define Q8_MAC_ADDR_LEN 6
#define BIT_0 (0x1 << 0)
#define BIT_1 (0x1 << 1)
#define BIT_2 (0x1 << 2)
#define BIT_3 (0x1 << 3)
#define BIT_4 (0x1 << 4)
#define BIT_5 (0x1 << 5)
#define BIT_6 (0x1 << 6)
#define BIT_7 (0x1 << 7)
#define BIT_8 (0x1 << 8)
#define BIT_9 (0x1 << 9)
#define BIT_10 (0x1 << 10)
#define BIT_11 (0x1 << 11)
#define BIT_12 (0x1 << 12)
#define BIT_13 (0x1 << 13)
#define BIT_14 (0x1 << 14)
#define BIT_15 (0x1 << 15)
#define BIT_16 (0x1 << 16)
#define BIT_17 (0x1 << 17)
#define BIT_18 (0x1 << 18)
#define BIT_19 (0x1 << 19)
#define BIT_20 (0x1 << 20)
#define BIT_21 (0x1 << 21)
#define BIT_22 (0x1 << 22)
#define BIT_23 (0x1 << 23)
#define BIT_24 (0x1 << 24)
#define BIT_25 (0x1 << 25)
#define BIT_11 (0x1 << 11)
#define BIT_12 (0x1 << 12)
#define BIT_13 (0x1 << 13)
#define BIT_14 (0x1 << 14)
#define BIT_15 (0x1 << 15)
#define BIT_16 (0x1 << 16)
#define BIT_17 (0x1 << 17)
#define BIT_18 (0x1 << 18)
#define BIT_19 (0x1 << 19)
#define BIT_20 (0x1 << 20)
#define BIT_21 (0x1 << 21)
#define BIT_22 (0x1 << 22)
#define BIT_23 (0x1 << 23)
#define BIT_24 (0x1 << 24)
#define BIT_25 (0x1 << 25)
#define BIT_26 (0x1 << 26)
#define BIT_27 (0x1 << 27)
#define BIT_28 (0x1 << 28)
#define BIT_29 (0x1 << 29)
#define BIT_30 (0x1 << 30)
#define BIT_31 (0x1 << 31)
/*
* Firmware Interface
*/
/*********************************************************************
* Work Queue Register Map
*********************************************************************/
#define Q81_WRKQ_INDEX_REG 0x00
#define Q81_WRKQ_CONS_INDEX_MASK 0xFFFF0000
#define Q81_WRKQ_PROD_INDEX_MASK 0x0000FFFF
#define Q81_WRKQ_VALID_REG 0x04
#define Q81_WRKQ_VALID_ONQ BIT_25
#define Q81_WRKQ_VALID_V BIT_4
/*********************************************************************
* Completion Queue Register Map
*********************************************************************/
#define Q81_COMPQ_INDEX_REG 0x00
#define Q81_COMPQ_PROD_INDEX_MASK 0xFFFF0000
#define Q81_COMPQ_CONS_INDEX_MASK 0x0000FFFF
#define Q81_COMPQ_VALID_REG 0x04
#define Q81_COMPQ_VALID_V BIT_4
#define Q81_LRGBQ_INDEX_REG 0x18
#define Q81_LRGBQ_CONS_INDEX_MASK 0xFFFF0000
#define Q81_LRGBQ_PROD_INDEX_MASK 0x0000FFFF
#define Q81_SMBQ_INDEX_REG 0x1C
#define Q81_SMBQ_CONS_INDEX_MASK 0xFFFF0000
#define Q81_SMBQ_PROD_INDEX_MASK 0x0000FFFF
/*********************************************************************
* Control Register Definitions
* (Access, Function Specific, Shared via Semaphore, Control by MPI FW)
*********************************************************************/
#define Q81_CTL_PROC_ADDR 0x00 /* R/W - Y - */
#define Q81_CTL_PROC_DATA 0x04 /* R/W - Y - */
#define Q81_CTL_SYSTEM 0x08 /* MWR - - - */
#define Q81_CTL_RESET 0x0C /* MWR Y - - */
#define Q81_CTL_FUNC_SPECIFIC 0x10 /* MWR Y - - */
#define Q81_CTL_HOST_CMD_STATUS 0x14 /* R/W Y - - */
#define Q81_CTL_LED 0x18 /* R/W Y - Y */
#define Q81_CTL_ICB_ACCESS_ADDR_LO 0x20 /* R/W - Y - */
#define Q81_CTL_ICB_ACCESS_ADDR_HI 0x24 /* R/W - Y - */
#define Q81_CTL_CONFIG 0x28 /* MWR - - - */
#define Q81_CTL_STATUS 0x30 /* MWR Y - - */
#define Q81_CTL_INTR_ENABLE 0x34 /* MWR Y - - */
#define Q81_CTL_INTR_MASK 0x38 /* MWR Y - - */
#define Q81_CTL_INTR_STATUS1 0x3C /* RO Y - - */
#define Q81_CTL_INTR_STATUS2 0x40 /* RO Y - - */
#define Q81_CTL_INTR_STATUS3 0x44 /* RO Y - - */
#define Q81_CTL_INTR_STATUS4 0x48 /* RO Y - - */
#define Q81_CTL_REV_ID 0x4C /* RO - - - */
#define Q81_CTL_FATAL_ERR_STATUS 0x54 /* RO Y - - */
#define Q81_CTL_COR_ECC_ERR_COUNTER 0x60 /* RO Y - - */
#define Q81_CTL_SEMAPHORE 0x64 /* MWR Y - - */
#define Q81_CTL_GPIO1 0x68 /* MWR Y - - */
#define Q81_CTL_GPIO2 0x6C /* MWR Y - - */
#define Q81_CTL_GPIO3 0x70 /* MWR Y - - */
#define Q81_CTL_XGMAC_ADDR 0x78 /* R/W Y Y - */
#define Q81_CTL_XGMAC_DATA 0x7C /* R/W Y Y Y */
#define Q81_CTL_NIC_ENH_TX_SCHD 0x80 /* R/W Y - Y */
#define Q81_CTL_CNA_ENH_TX_SCHD 0x84 /* R/W Y - Y */
#define Q81_CTL_FLASH_ADDR 0x88 /* R/W - Y - */
#define Q81_CTL_FLASH_DATA 0x8C /* R/W - Y - */
#define Q81_CTL_STOP_CQ_PROCESSING 0x90 /* MWR Y - - */
#define Q81_CTL_MAC_PROTO_ADDR_INDEX 0xA8 /* R/W - Y - */
#define Q81_CTL_MAC_PROTO_ADDR_DATA 0xAC /* R/W - Y - */
#define Q81_CTL_COS_DEF_CQ1 0xB0 /* R/W Y - - */
#define Q81_CTL_COS_DEF_CQ2 0xB4 /* R/W Y - - */
#define Q81_CTL_ETHERTYPE_SKIP_1 0xB8 /* R/W Y - - */
#define Q81_CTL_ETHERTYPE_SKIP_2 0xBC /* R/W Y - - */
#define Q81_CTL_SPLIT_HDR 0xC0 /* R/W Y - - */
#define Q81_CTL_NIC_PAUSE_THRES 0xC8 /* R/W Y - Y */
#define Q81_CTL_NIC_RCV_CONFIG 0xD4 /* MWR Y - Y */
#define Q81_CTL_COS_TAGS_IN_NIC_FIFO 0xDC /* R/W Y - Y */
#define Q81_CTL_MGMT_RCV_CONFIG 0xE0 /* MWR Y - Y */
#define Q81_CTL_ROUTING_INDEX 0xE4 /* R/W Y Y - */
#define Q81_CTL_ROUTING_DATA 0xE8 /* R/W Y Y - */
#define Q81_CTL_XG_SERDES_ADDR 0xF0 /* R/W Y Y Y */
#define Q81_CTL_XG_SERDES_DATA 0xF4 /* R/W Y Y Y */
#define Q81_CTL_XG_PROBE_MUX_ADDR 0xF8 /* R/W - Y - */
#define Q81_CTL_XG_PROBE_MUX_DATA 0xFC /* R/W - Y - */
/*
* Process Address Register (0x00)
*/
#define Q81_CTL_PROC_ADDR_RDY BIT_31
#define Q81_CTL_PROC_ADDR_READ BIT_30
#define Q81_CTL_PROC_ADDR_ERR BIT_29
#define Q81_CTL_PROC_ADDR_MPI_RISC (0x00 << 16)
#define Q81_CTL_PROC_ADDR_MDE (0x01 << 16)
#define Q81_CTL_PROC_ADDR_REG_BLOCK (0x02 << 16)
#define Q81_CTL_PROC_ADDR_RISC_INT_REG (0x03 << 16)
/*
* System Register (0x08)
*/
#define Q81_CTL_SYSTEM_MASK_SHIFT 16
#define Q81_CTL_SYSTEM_ENABLE_VQM_WR BIT_5
#define Q81_CTL_SYSTEM_ENABLE_DWC BIT_4
#define Q81_CTL_SYSTEM_ENABLE_DA_SINGLE_THRD BIT_3
#define Q81_CTL_SYSTEM_ENABLE_MDC BIT_2
#define Q81_CTL_SYSTEM_ENABLE_FAE BIT_1
#define Q81_CTL_SYSTEM_ENABLE_EFE BIT_0
/*
* Reset Register (0x0C)
*/
#define Q81_CTL_RESET_MASK_SHIFT 16
#define Q81_CTL_RESET_FUNC BIT_15
#define Q81_CTL_RESET_RR_SHIFT 1
/*
* Function Specific Control Register (0x10)
*/
#define Q81_CTL_FUNC_SPECIFIC_MASK_SHIFT 16
#define Q81_CTL_FUNC_SPECIFIC_FE BIT_15
#define Q81_CTL_FUNC_SPECIFIC_STE BIT_13
#define Q81_CTL_FUNC_SPECIFIC_DSB BIT_12
#define Q81_CTL_FUNC_SPECIFIC_SH BIT_11
#define Q81_CTL_FUNC_SPECIFIC_VM_PGSIZE_MASK (0x7 << 8)
#define Q81_CTL_FUNC_SPECIFIC_VM_PGSIZE_2K (0x1 << 8)
#define Q81_CTL_FUNC_SPECIFIC_VM_PGSIZE_4K (0x2 << 8)
#define Q81_CTL_FUNC_SPECIFIC_VM_PGSIZE_8K (0x3 << 8)
#define Q81_CTL_FUNC_SPECIFIC_VM_PGSIZE_64K (0x6 << 8)
#define Q81_CTL_FUNC_SPECIFIC_EPC_O BIT_7
#define Q81_CTL_FUNC_SPECIFIC_EPC_I BIT_6
#define Q81_CTL_FUNC_SPECIFIC_EC BIT_5
#define Q81_CTL_FUNC_SPECIFIC_DBL_DBRST (0x00 << 3)
#define Q81_CTL_FUNC_SPECIFIC_DBL_MAX_PAYLDSZ (0x01 << 3)
#define Q81_CTL_FUNC_SPECIFIC_DBL_MAX_RDBRSTSZ (0x02 << 3)
#define Q81_CTL_FUNC_SPECIFIC_DBL_128 (0x03 << 3)
#define Q81_CTL_FUNC_SPECIFIC_DBRST_256 0x00
#define Q81_CTL_FUNC_SPECIFIC_DBRST_512 0x01
#define Q81_CTL_FUNC_SPECIFIC_DBRST_768 0x02
#define Q81_CTL_FUNC_SPECIFIC_DBRST_1024 0x03
/*
* Host Command/Status Register (0x14)
*/
#define Q81_CTL_HCS_CMD_NOP (0x00 << 28)
#define Q81_CTL_HCS_CMD_SET_RISC_RESET (0x01 << 28)
#define Q81_CTL_HCS_CMD_CLR_RISC_RESET (0x02 << 28)
#define Q81_CTL_HCS_CMD_SET_RISC_PAUSE (0x03 << 28)
#define Q81_CTL_HCS_CMD_CLR_RISC_PAUSE (0x04 << 28)
#define Q81_CTL_HCS_CMD_SET_HTR_INTR (0x05 << 28)
#define Q81_CTL_HCS_CMD_CLR_HTR_INTR (0x06 << 28)
#define Q81_CTL_HCS_CMD_SET_PARITY_EN (0x07 << 28)
#define Q81_CTL_HCS_CMD_FORCE_BAD_PARITY (0x08 << 28)
#define Q81_CTL_HCS_CMD_CLR_BAD_PARITY (0x09 << 28)
#define Q81_CTL_HCS_CMD_CLR_RTH_INTR (0x0A << 28)
#define Q81_CTL_HCS_CMD_PAR_SHIFT 22
#define Q81_CTL_HCS_RISC_PAUSED BIT_10
#define Q81_CTL_HCS_HTR_INTR BIT_9
#define Q81_CTL_HCS_RISC_RESET BIT_8
#define Q81_CTL_HCS_ERR_STATUS_MASK 0x3F
/*
* Configuration Register (0x28)
*/
#define Q81_CTL_CONFIG_MASK_SHIFT 16
#define Q81_CTL_CONFIG_Q_NUM_SHIFT 8
#define Q81_CTL_CONFIG_Q_NUM_MASK (0x7F << Q81_CTL_CONFIG_Q_NUM_SHIFT)
#define Q81_CTL_CONFIG_DCQ BIT_7
#define Q81_CTL_CONFIG_LCQ BIT_6
#define Q81_CTL_CONFIG_LE BIT_5
#define Q81_CTL_CONFIG_DR BIT_3
#define Q81_CTL_CONFIG_LR BIT_2
#define Q81_CTL_CONFIG_DRQ BIT_1
#define Q81_CTL_CONFIG_LRQ BIT_0
/*
* Status Register (0x30)
*/
#define Q81_CTL_STATUS_MASK_SHIFT 16
#define Q81_CTL_STATUS_NFE BIT_12
#define Q81_CTL_STATUS_F3E BIT_11
#define Q81_CTL_STATUS_F2E BIT_10
#define Q81_CTL_STATUS_F1E BIT_9
#define Q81_CTL_STATUS_F0E BIT_8
#define Q81_CTL_STATUS_FUNC_SHIFT 6
#define Q81_CTL_STATUS_PI1 BIT_5
#define Q81_CTL_STATUS_PI0 BIT_4
#define Q81_CTL_STATUS_PL1 BIT_3
#define Q81_CTL_STATUS_PL0 BIT_2
#define Q81_CTL_STATUS_PI BIT_1
#define Q81_CTL_STATUS_FE BIT_0
/*
* Interrupt Enable Register (0x34)
*/
#define Q81_CTL_INTRE_MASK_SHIFT 16
#define Q81_CTL_INTRE_EN BIT_15
#define Q81_CTL_INTRE_EI BIT_14
#define Q81_CTL_INTRE_IHD BIT_13
#define Q81_CTL_INTRE_RTYPE_MASK (0x3 << 8)
#define Q81_CTL_INTRE_RTYPE_ENABLE (0x1 << 8)
#define Q81_CTL_INTRE_RTYPE_DISABLE (0x2 << 8)
#define Q81_CTL_INTRE_RTYPE_SETUP_TO_RD (0x3 << 8)
#define Q81_CTL_INTRE_HOST_INTR_MASK 0x7F
/*
* Interrupt Mask Register (0x38)
*/
#define Q81_CTL_INTRM_MASK_SHIFT 16
#define Q81_CTL_INTRM_MC BIT_7
#define Q81_CTL_INTRM_LSC BIT_6
#define Q81_CTL_INTRM_LH1 BIT_4
#define Q81_CTL_INTRM_HL1 BIT_3
#define Q81_CTL_INTRM_LH0 BIT_2
#define Q81_CTL_INTRM_HL0 BIT_1
#define Q81_CTL_INTRM_PI BIT_0
/*
* Interrupt Status 1 Register (0x3C)
*/
#define Q81_CTL_INTRS1_COMPQ(i) (0x1 << i)
/*
* Interrupt Status 2 Register (0x40)
*/
#define Q81_CTL_INTRS2_COMPQ(i) (0x1 << i)
/*
* Interrupt Status 3 Register (0x44)
*/
#define Q81_CTL_INTRS3_COMPQ(i) (0x1 << i)
/*
* Interrupt Status 4 Register (0x48)
*/
#define Q81_CTL_INTRS4_COMPQ(i) (0x1 << i)
/*
* Revision ID Register (0x4C)
*/
#define Q81_CTL_REV_ID_CHIP_REV_MASK (0xF << 28)
#define Q81_CTL_REV_ID_XGMAC_RCV_MASK (0xF << 16)
#define Q81_CTL_REV_ID_XGMAC_ROLL_MASK (0xF << 8)
#define Q81_CTL_REV_ID_NIC_REV_MASK (0xF << 4)
#define Q81_CTL_REV_ID_NIC_ROLL_MASK (0xF << 0)
/*
* Semaphore Register (0x64)
*/
#define Q81_CTL_SEM_MASK_PROC_ADDR_NIC_RCV 0xC0000000
#define Q81_CTL_SEM_MASK_RIDX_DATAREG 0x30000000
#define Q81_CTL_SEM_MASK_FLASH 0x03000000
#define Q81_CTL_SEM_MASK_MAC_SERDES 0x00C00000
#define Q81_CTL_SEM_MASK_ICB 0x00300000
#define Q81_CTL_SEM_MASK_XGMAC1 0x000C0000
#define Q81_CTL_SEM_MASK_XGMAC0 0x00030000
#define Q81_CTL_SEM_SET_PROC_ADDR_NIC_RCV 0x4000
#define Q81_CTL_SEM_SET_RIDX_DATAREG 0x1000
#define Q81_CTL_SEM_SET_FLASH 0x0100
#define Q81_CTL_SEM_SET_MAC_SERDES 0x0040
#define Q81_CTL_SEM_SET_ICB 0x0010
#define Q81_CTL_SEM_SET_XGMAC1 0x0004
#define Q81_CTL_SEM_SET_XGMAC0 0x0001
/*
* Flash Address Register (0x88)
*/
#define Q81_CTL_FLASH_ADDR_RDY BIT_31
#define Q81_CTL_FLASH_ADDR_R BIT_30
#define Q81_CTL_FLASH_ADDR_ERR BIT_29
#define Q81_CTL_FLASH_ADDR_MASK 0x7FFFFF
/*
* Stop CQ Processing Register (0x90)
*/
#define Q81_CTL_STOP_CQ_MASK_SHIFT 16
#define Q81_CTL_STOP_CQ_EN BIT_15
#define Q81_CTL_STOP_CQ_RQ_STARTQ (0x1 << 8)
#define Q81_CTL_STOP_CQ_RQ_STOPQ (0x2 << 8)
#define Q81_CTL_STOP_CQ_RQ_READ (0x3 << 8)
#define Q81_CTL_STOP_CQ_MASK 0x7F
/*
* MAC Protocol Address Index Register (0xA8)
*/
#define Q81_CTL_MAC_PROTO_AI_MW BIT_31
#define Q81_CTL_MAC_PROTO_AI_MR BIT_30
#define Q81_CTL_MAC_PROTO_AI_E BIT_27
#define Q81_CTL_MAC_PROTO_AI_RS BIT_26
#define Q81_CTL_MAC_PROTO_AI_ADR BIT_25
#define Q81_CTL_MAC_PROTO_AI_TYPE_SHIFT 16
#define Q81_CTL_MAC_PROTO_AI_TYPE_MASK 0xF0000
#define Q81_CTL_MAC_PROTO_AI_IDX_SHIFT 4
#define Q81_CTL_MAC_PROTO_AI_IDX_MASK 0xFFF0
#define Q81_CTL_MAC_PROTO_AI_OFF_MASK 0xF
#define Q81_CTL_MAC_PROTO_AI_TYPE_CAM_MAC (0 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MCAST (1 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_VLAN (2 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MCAST_FILTER (3 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MGMT_MAC (5 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MGMMT_VLAN (6 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MGMT_IPV4 (7 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MGMT_IPV6 (8 << 16)
#define Q81_CTL_MAC_PROTO_AI_TYPE_MGMT_PORT (9 << 16) /* TCP/UDP Port */
/*
* CAM MAC offset 2 definitions
*/
#define Q81_CAM_MAC_OFF2_ROUTE_FC 0x00000000
#define Q81_CAM_MAC_OFF2_ROUTE_NIC 0x00000001
#define Q81_CAM_MAC_OFF2_FUNC_SHIFT 2
#define Q81_CAM_MAC_OFF2_RV 0x00000010
#define Q81_CAM_MAC_OFF2_CQID_SHIFT 5
#define Q81_CAM_MAC_OFF2_SH 0x00008000
#define Q81_CAM_MAC_OFF2_MHT 0x40000000
#define Q81_CAM_MAC_OFF2_VLD 0x80000000
/*
* NIC Pause Threshold Register (0xC8)
*/
#define Q81_CTL_NIC_PAUSE_THRES_PAUSE_SHIFT 16
#define Q81_CTL_NIC_PAUSE_THRES_RESUME_SHIFT 0
/*
* NIC Receive Configuration Register (0xD4)
*/
#define Q81_CTL_NIC_RCVC_MASK_SHIFT 16
#define Q81_CTL_NIC_RCVC_DCQ_SHIFT 8
#define Q81_CTL_NIC_RCVC_DCQ_MASK 0x7F00
#define Q81_CTL_NIC_RCVC_DTP BIT_5
#define Q81_CTL_NIC_RCVC_R4T BIT_4
#define Q81_CTL_NIC_RCVC_RV BIT_3
#define Q81_CTL_NIC_RCVC_VLAN_ALL (0x0 << 1)
#define Q81_CTL_NIC_RCVC_VLAN_ONLY (0x1 << 1)
#define Q81_CTL_NIC_RCVC_VLAN_NON_VLAN (0x2 << 1)
#define Q81_CTL_NIC_RCVC_VLAN_REJECT (0x3 << 1)
#define Q81_CTL_NIC_RCVC_PPE BIT_0
/*
* Routing Index Register (0xE4)
*/
#define Q81_CTL_RI_MW BIT_31
#define Q81_CTL_RI_MR BIT_30
#define Q81_CTL_RI_E BIT_27
#define Q81_CTL_RI_RS BIT_26
#define Q81_CTL_RI_DST_RSS (0x00 << 20)
#define Q81_CTL_RI_DST_CAMQ (0x01 << 20)
#define Q81_CTL_RI_DST_COSQ (0x02 << 20)
#define Q81_CTL_RI_DST_DFLTQ (0x03 << 20)
#define Q81_CTL_RI_DST_DESTQ (0x04 << 20)
#define Q81_CTL_RI_DST_DROP (0x07 << 20)
#define Q81_CTL_RI_TYPE_RTMASK (0x00 << 16)
#define Q81_CTL_RI_TYPE_RTINVMASK (0x01 << 16)
#define Q81_CTL_RI_TYPE_NICQMASK (0x02 << 16)
#define Q81_CTL_RI_TYPE_NICQINVMASK (0x03 << 16)
/* these indices for the Routing Index Register are user defined */
#define Q81_CTL_RI_IDX_ALL_ERROR (0x00 << 8)
#define Q81_CTL_RI_IDX_MAC_ERROR (0x00 << 8)
#define Q81_CTL_RI_IDX_IPCSUM_ERROR (0x01 << 8)
#define Q81_CTL_RI_IDX_TCPCSUM_ERROR (0x02 << 8)
#define Q81_CTL_RI_IDX_BCAST (0x03 << 8)
#define Q81_CTL_RI_IDX_MCAST_MATCH (0x04 << 8)
#define Q81_CTL_RI_IDX_ALLMULTI (0x05 << 8)
#define Q81_CTL_RI_IDX_RSS_MATCH (0x08 << 8)
#define Q81_CTL_RI_IDX_RSS_IPV4 (0x08 << 8)
#define Q81_CTL_RI_IDX_RSS_IPV6 (0x09 << 8)
#define Q81_CTL_RI_IDX_RSS_TCPV4 (0x0A << 8)
#define Q81_CTL_RI_IDX_RSS_TCPV6 (0x0B << 8)
#define Q81_CTL_RI_IDX_CAM_HIT (0x0C << 8)
#define Q81_CTL_RI_IDX_PROMISCUOUS (0x0F << 8)
/* Routing Masks to be loaded into Routing Data Register */
#define Q81_CTL_RD_BCAST BIT_0
#define Q81_CTL_RD_MCAST BIT_1
#define Q81_CTL_RD_MCAST_MATCH BIT_2
#define Q81_CTL_RD_MCAST_REG_MATCH BIT_3
#define Q81_CTL_RD_MCAST_HASH_MATCH BIT_4
#define Q81_CTL_RD_CAM_HIT BIT_7
#define Q81_CTL_RD_CAM_BIT0 BIT_8
#define Q81_CTL_RD_CAM_BIT1 BIT_9
#define Q81_CTL_RD_VLAN_TAG_PRESENT BIT_10
#define Q81_CTL_RD_VLAN_MATCH BIT_11
#define Q81_CTL_RD_VLAN_FILTER_PASS BIT_12
#define Q81_CTL_RD_SKIP_ETHERTYPE_1 BIT_13
#define Q81_CTL_RD_SKIP_ETHERTYPE_2 BIT_14
#define Q81_CTL_RD_BCAST_OR_MCAST_MATCH BIT_15
#define Q81_CTL_RD_802_3_PKT BIT_16
#define Q81_CTL_RD_LLDP_PKT BIT_17
#define Q81_CTL_RD_TUNNELED_PKT BIT_18
#define Q81_CTL_RD_ERROR_PKT BIT_22
#define Q81_CTL_RD_VALID_PKT BIT_23
#define Q81_CTL_RD_TCP_UDP_CSUM_ERR BIT_24
#define Q81_CTL_RD_IPCSUM_ERR BIT_25
#define Q81_CTL_RD_MAC_ERR BIT_26
#define Q81_CTL_RD_RSS_TCP_IPV6 BIT_27
#define Q81_CTL_RD_RSS_TCP_IPV4 BIT_28
#define Q81_CTL_RD_RSS_IPV6 BIT_29
#define Q81_CTL_RD_RSS_IPV4 BIT_30
#define Q81_CTL_RD_RSS_MATCH BIT_31
/*********************************************************************
* Host Data Structures *
*********************************************************************/
/*
* Work Queue Initialization Control Block
*/
typedef struct _q81_wq_icb {
uint16_t length_v;
#define Q81_WQ_ICB_VALID BIT_4
uint8_t pri;
#define Q81_WQ_ICB_PRI_SHIFT 1
uint8_t flags;
#define Q81_WQ_ICB_FLAGS_LO BIT_7
#define Q81_WQ_ICB_FLAGS_LI BIT_6
#define Q81_WQ_ICB_FLAGS_LB BIT_5
#define Q81_WQ_ICB_FLAGS_LC BIT_4
uint16_t wqcqid_rss;
#define Q81_WQ_ICB_RSS_V BIT_15
uint16_t rsrvd;
uint32_t baddr_lo;
uint32_t baddr_hi;
uint32_t ci_addr_lo;
uint32_t ci_addr_hi;
} __packed q81_wq_icb_t;
/*
* Completion Queue Initialization Control Block
*/
typedef struct _q81_cq_icb {
uint8_t msix_vector;
uint16_t rsrvd0;
uint8_t flags;
#define Q81_CQ_ICB_FLAGS_LC BIT_7
#define Q81_CQ_ICB_FLAGS_LI BIT_6
#define Q81_CQ_ICB_FLAGS_LL BIT_5
#define Q81_CQ_ICB_FLAGS_LS BIT_4
#define Q81_CQ_ICB_FLAGS_LV BIT_3
uint16_t length_v;
#define Q81_CQ_ICB_VALID BIT_4
uint16_t rsrvd1;
uint32_t cq_baddr_lo;
uint32_t cq_baddr_hi;
uint32_t cqi_addr_lo;
uint32_t cqi_addr_hi;
uint16_t pkt_idelay;
uint16_t idelay;
uint32_t lbq_baddr_lo;
uint32_t lbq_baddr_hi;
uint16_t lbq_bsize;
uint16_t lbq_length;
uint32_t sbq_baddr_lo;
uint32_t sbq_baddr_hi;
uint16_t sbq_bsize;
uint16_t sbq_length;
} __packed q81_cq_icb_t;
/*
* RSS Initialization Control Block
*/
typedef struct _q81_rss_icb {
uint16_t flags_base_cq_num;
#define Q81_RSS_ICB_FLAGS_L4K BIT_7
#define Q81_RSS_ICB_FLAGS_L6K BIT_8
#define Q81_RSS_ICB_FLAGS_LI BIT_9
#define Q81_RSS_ICB_FLAGS_LB BIT_10
#define Q81_RSS_ICB_FLAGS_LM BIT_11
#define Q81_RSS_ICB_FLAGS_RI4 BIT_12
#define Q81_RSS_ICB_FLAGS_RT4 BIT_13
#define Q81_RSS_ICB_FLAGS_RI6 BIT_14
#define Q81_RSS_ICB_FLAGS_RT6 BIT_15
uint16_t mask; /* bits 9-0 are valid */
#define Q81_RSS_ICB_NUM_INDTBL_ENTRIES 1024
/* Indirection Table */
uint8_t cq_id[Q81_RSS_ICB_NUM_INDTBL_ENTRIES];
/* Hash Keys */
uint32_t ipv6_rss_hash_key[10];
uint32_t ipv4_rss_hash_key[4];
} __packed q81_rss_icb_t;
/*
* Transmit Buffer Descriptor
*/
typedef struct _q81_txb_desc {
uint64_t baddr;
uint16_t length;
uint16_t flags;
#define Q81_TXB_DESC_FLAGS_E BIT_15
#define Q81_TXB_DESC_FLAGS_C BIT_14
} __packed q81_txb_desc_t;
/*
* Receive Buffer Descriptor
*/
typedef struct _q81_rxb_desc {
uint32_t baddr_lo;
#define Q81_RXB_DESC_BADDR_LO_S BIT_1
uint64_t baddr;
uint16_t length;
uint16_t flags;
#define Q81_RXB_DESC_FLAGS_E BIT_15
#define Q81_RXB_DESC_FLAGS_C BIT_14
} __packed q81_rxb_desc_t;
/*
* IOCB Types
*/
#define Q81_IOCB_TX_MAC 0x01
#define Q81_IOCB_TX_TSO 0x02
#define Q81_IOCB_RX 0x20
#define Q81_IOCB_MPI 0x21
#define Q81_IOCB_SYS 0x3F
/*
* IOCB Definitions
*/
/*
* MAC Tx Frame IOCB
* Total Size of each IOCB Entry = 4 * 32 = 128 bytes
*/
#define MAX_TX_MAC_DESC 8
typedef struct _q81_tx_mac {
uint8_t opcode;
uint16_t flags;
#define Q81_TX_MAC_FLAGS_D BIT_3
#define Q81_TX_MAC_FLAGS_I BIT_1
#define Q81_TX_MAC_FLAGS_OI BIT_0
uint8_t vlan_off;
#define Q81_TX_MAC_VLAN_OFF_SHIFT 3
#define Q81_TX_MAC_VLAN_OFF_V BIT_2
#define Q81_TX_MAC_VLAN_OFF_DFP BIT_1
uint32_t rsrvd1;
uint32_t rsrvd2;
uint16_t frame_length; /* only bits0-13 are valid */
uint16_t rsrvd3;
uint32_t tid_lo;
uint32_t tid_hi;
uint32_t rsrvd4;
uint16_t vlan_tci;
uint16_t rsrvd5;
q81_txb_desc_t txd[MAX_TX_MAC_DESC];
} __packed q81_tx_mac_t;
/*
* MAC Tx Frame with TSO IOCB
* Total Size of each IOCB Entry = 4 * 32 = 128 bytes
*/
typedef struct _q81_tx_tso {
uint8_t opcode;
uint16_t flags;
#define Q81_TX_TSO_FLAGS_OI BIT_0
#define Q81_TX_TSO_FLAGS_I BIT_1
#define Q81_TX_TSO_FLAGS_D BIT_3
#define Q81_TX_TSO_FLAGS_IPV4 BIT_6
#define Q81_TX_TSO_FLAGS_IPV6 BIT_7
#define Q81_TX_TSO_FLAGS_LSO BIT_13
#define Q81_TX_TSO_FLAGS_UC BIT_14
#define Q81_TX_TSO_FLAGS_TC BIT_15
uint8_t vlan_off;
#define Q81_TX_TSO_VLAN_OFF_SHIFT 3
#define Q81_TX_TSO_VLAN_OFF_V BIT_2
#define Q81_TX_TSO_VLAN_OFF_DFP BIT_1
#define Q81_TX_TSO_VLAN_OFF_IC BIT_0
uint32_t rsrvd1;
uint32_t rsrvd2;
uint32_t length;
uint32_t tid_lo;
uint32_t tid_hi;
uint16_t phdr_length;
uint16_t phdr_offsets;
#define Q81_TX_TSO_PHDR_SHIFT 6
uint16_t vlan_tci;
uint16_t mss;
q81_txb_desc_t txd[MAX_TX_MAC_DESC];
} __packed q81_tx_tso_t;
typedef struct _q81_tx_cmd {
uint8_t bytes[128];
} __packed q81_tx_cmd_t;
/*
* MAC TX Frame Completion
* Total Size of each IOCB Entry = 4 * 16 = 64 bytes
*/
typedef struct _q81_tx_mac_comp {
uint8_t opcode;
uint8_t flags;
#define Q81_TX_MAC_COMP_FLAGS_OI BIT_0
#define Q81_TX_MAC_COMP_FLAGS_I BIT_1
#define Q81_TX_MAC_COMP_FLAGS_E BIT_3
#define Q81_TX_MAC_COMP_FLAGS_S BIT_4
#define Q81_TX_MAC_COMP_FLAGS_L BIT_5
#define Q81_TX_MAC_COMP_FLAGS_P BIT_6
uint8_t rsrvd0;
uint8_t err;
#define Q81_TX_MAC_COMP_ERR_B BIT_7
uint32_t tid_lo;
uint32_t tid_hi;
uint32_t rsrvd1[13];
} __packed q81_tx_mac_comp_t;
/*
* MAC TX Frame with LSO Completion
* Total Size of each IOCB Entry = 4 * 16 = 64 bytes
*/
typedef struct _q81_tx_tso_comp {
uint8_t opcode;
uint8_t flags;
#define Q81_TX_TSO_COMP_FLAGS_OI BIT_0
#define Q81_TX_TSO_COMP_FLAGS_I BIT_1
#define Q81_TX_TSO_COMP_FLAGS_E BIT_3
#define Q81_TX_TSO_COMP_FLAGS_S BIT_4
#define Q81_TX_TSO_COMP_FLAGS_P BIT_6
uint8_t rsrvd0;
uint8_t err;
#define Q81_TX_TSO_COMP_ERR_B BIT_7
uint32_t tid_lo;
uint32_t tid_hi;
uint32_t rsrvd1[13];
} __packed q81_tx_tso_comp_t;
/*
* SYS - Chip Event Notification Completion
* Total Size of each IOCB Entry = 4 * 16 = 64 bytes
*/
typedef struct _q81_sys_comp {
uint8_t opcode;
uint8_t flags;
#define Q81_SYS_COMP_FLAGS_OI BIT_0
#define Q81_SYS_COMP_FLAGS_I BIT_1
uint8_t etype;
#define Q81_SYS_COMPE_LINK_UP 0x00
#define Q81_SYS_COMPE_LINK_DOWN 0x01
#define Q81_SYS_COMPE_MULTI_CAM_LOOKUP 0x06
#define Q81_SYS_COMPE_SOFT_ECC 0x07
#define Q81_SYS_COMPE_MPI_FATAL_ERROR 0x08
#define Q81_SYS_COMPE_MAC_INTR 0x09
#define Q81_SYS_COMPE_GPI0_HTOL 0x10
#define Q81_SYS_COMPE_GPI0_LTOH 0x20
#define Q81_SYS_COMPE_GPI1_HTOL 0x11
#define Q81_SYS_COMPE_GPI1_LTOH 0x21
uint8_t q_id; /* only bits 0-6 are valid */
uint32_t rsrvd1[15];
} __packed q81_sys_comp_t;
/*
* Mac Rx Packet Completion
* Total Size of each IOCB Entry = 4 * 16 = 64 bytes
*/
typedef struct _q81_rx {
uint8_t opcode;
uint8_t flags0;
#define Q81_RX_FLAGS0_OI BIT_0
#define Q81_RX_FLAGS0_I BIT_1
#define Q81_RX_FLAGS0_TE BIT_2
#define Q81_RX_FLAGS0_NU BIT_3
#define Q81_RX_FLAGS0_IE BIT_4
#define Q81_RX_FLAGS0_MCAST_MASK (0x03 << 5)
#define Q81_RX_FLAGS0_MCAST_NONE (0x00 << 5)
#define Q81_RX_FLAGS0_MCAST_HASH_MATCH (0x01 << 5)
#define Q81_RX_FLAGS0_MCAST_REG_MATCH (0x02 << 5)
#define Q81_RX_FLAGS0_MCAST_PROMISC (0x03 << 5)
#define Q81_RX_FLAGS0_B BIT_7
uint16_t flags1;
#define Q81_RX_FLAGS1_P BIT_0
#define Q81_RX_FLAGS1_V BIT_1
#define Q81_RX_FLAGS1_ERR_NONE (0x00 << 2)
#define Q81_RX_FLAGS1_ERR_CODE (0x01 << 2)
#define Q81_RX_FLAGS1_ERR_OSIZE (0x02 << 2)
#define Q81_RX_FLAGS1_ERR_USIZE (0x04 << 2)
#define Q81_RX_FLAGS1_ERR_PREAMBLE (0x05 << 2)
#define Q81_RX_FLAGS1_ERR_FRAMELENGTH (0x06 << 2)
#define Q81_RX_FLAGS1_ERR_CRC (0x07 << 2)
#define Q81_RX_FLAGS1_ERR_MASK (0x07 << 2)
#define Q81_RX_FLAGS1_U BIT_5
#define Q81_RX_FLAGS1_T BIT_6
#define Q81_RX_FLAGS1_FO BIT_7
#define Q81_RX_FLAGS1_RSS_NO_MATCH (0x00 << 8)
#define Q81_RX_FLAGS1_RSS_IPV4_MATCH (0x04 << 8)
#define Q81_RX_FLAGS1_RSS_IPV6_MATCH (0x02 << 8)
#define Q81_RX_FLAGS1_RSS_TCPIPV4_MATCH (0x05 << 8)
#define Q81_RX_FLAGS1_RSS_TCPIPV4_MATCH (0x05 << 8)
#define Q81_RX_FLAGS1_RSS_MATCH_MASK (0x07 << 8)
#define Q81_RX_FLAGS1_V4 BIT_11
#define Q81_RX_FLAGS1_V6 BIT_12
#define Q81_RX_FLAGS1_IH BIT_13
#define Q81_RX_FLAGS1_DS BIT_14
#define Q81_RX_FLAGS1_DL BIT_15
uint32_t length;
uint64_t b_paddr;
uint32_t rss;
uint16_t vlan_tag;
uint16_t rsrvd;
uint32_t rsrvd1;
uint32_t flags2;
#define Q81_RX_FLAGS2_HV BIT_13
#define Q81_RX_FLAGS2_HS BIT_14
#define Q81_RX_FLAGS2_HL BIT_15
uint32_t hdr_length;
uint32_t hdr_baddr_lo;
uint32_t hdr_baddr_hi;
} __packed q81_rx_t;
typedef struct _q81_cq_e {
uint8_t opcode;
uint8_t bytes[63];
} __packed q81_cq_e_t;
typedef struct _q81_bq_addr_e {
uint32_t addr_lo;
uint32_t addr_hi;
} __packed q81_bq_addr_e_t;
/*
* Macros for reading and writing registers
*/
#if defined(__i386__) || defined(__amd64__)
#define Q8_MB() __asm volatile("mfence" ::: "memory")
#define Q8_WMB() __asm volatile("sfence" ::: "memory")
#define Q8_RMB() __asm volatile("lfence" ::: "memory")
#else
#define Q8_MB()
#define Q8_WMB()
#define Q8_RMB()
#endif
#define READ_REG32(ha, reg) bus_read_4((ha->pci_reg), reg)
#define READ_REG64(ha, reg) bus_read_8((ha->pci_reg), reg)
#define WRITE_REG32_ONLY(ha, reg, val) bus_write_4((ha->pci_reg), reg, val)
#define WRITE_REG32(ha, reg, val) bus_write_4((ha->pci_reg), reg, val)
#define Q81_CTL_INTRE_MASK_VALUE \
(((Q81_CTL_INTRE_RTYPE_MASK | Q81_CTL_INTRE_HOST_INTR_MASK) << \
Q81_CTL_INTRE_MASK_SHIFT) | Q81_CTL_INTRE_RTYPE_ENABLE)
#define Q81_ENABLE_INTR(ha, idx) \
WRITE_REG32(ha, Q81_CTL_INTR_ENABLE, (Q81_CTL_INTRE_MASK_VALUE | idx))
#define Q81_CTL_INTRD_MASK_VALUE \
(((Q81_CTL_INTRE_RTYPE_MASK | Q81_CTL_INTRE_HOST_INTR_MASK) << \
Q81_CTL_INTRE_MASK_SHIFT) | Q81_CTL_INTRE_RTYPE_DISABLE)
#define Q81_DISABLE_INTR(ha, idx) \
WRITE_REG32(ha, Q81_CTL_INTR_ENABLE, (Q81_CTL_INTRD_MASK_VALUE | idx))
#define Q81_WR_WQ_PROD_IDX(wq_idx, idx) bus_write_4((ha->pci_reg1),\
(ha->tx_ring[wq_idx].wq_db_offset + Q81_WRKQ_INDEX_REG), idx)
#define Q81_RD_WQ_IDX(wq_idx) bus_read_4((ha->pci_reg1),\
(ha->tx_ring[wq_idx].wq_db_offset + Q81_WRKQ_INDEX_REG))
#define Q81_SET_WQ_VALID(wq_idx) bus_write_4((ha->pci_reg1),\
(ha->tx_ring[wq_idx].wq_db_offset + Q81_WRKQ_VALID_REG),\
Q81_COMPQ_VALID_V)
#define Q81_SET_WQ_INVALID(wq_idx) bus_write_4((ha->pci_reg1),\
(ha->tx_ring[wq_idx].wq_db_offset + Q81_WRKQ_VALID_REG),\
(~Q81_COMPQ_VALID_V))
#define Q81_WR_CQ_CONS_IDX(cq_idx, idx) bus_write_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_COMPQ_INDEX_REG), idx)
#define Q81_RD_CQ_IDX(cq_idx) bus_read_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_COMPQ_INDEX_REG))
#define Q81_SET_CQ_VALID(cq_idx) bus_write_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_COMPQ_VALID_REG),\
Q81_COMPQ_VALID_V)
#define Q81_SET_CQ_INVALID(cq_idx) bus_write_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_COMPQ_VALID_REG),\
~Q81_COMPQ_VALID_V)
#define Q81_WR_LBQ_PROD_IDX(cq_idx, idx) bus_write_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_LRGBQ_INDEX_REG), idx)
#define Q81_RD_LBQ_IDX(cq_idx) bus_read_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_LRGBQ_INDEX_REG))
#define Q81_WR_SBQ_PROD_IDX(cq_idx, idx) bus_write_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_SMBQ_INDEX_REG), idx)
#define Q81_RD_SBQ_IDX(cq_idx) bus_read_4((ha->pci_reg1),\
(ha->rx_ring[cq_idx].cq_db_offset + Q81_SMBQ_INDEX_REG))
/*
* Flash Related
*/
#define Q81_F0_FLASH_OFFSET 0x140200
#define Q81_F1_FLASH_OFFSET 0x140600
#define Q81_FLASH_ID "8000"
typedef struct _q81_flash {
uint8_t id[4]; /* equal to "8000" */
uint16_t version;
uint16_t size;
uint16_t csum;
uint16_t rsrvd0;
uint16_t total_size;
uint16_t nentries;
uint8_t dtype0;
uint8_t dsize0;
uint8_t mac_addr0[6];
uint8_t dtype1;
uint8_t dsize1;
uint8_t mac_addr1[6];
uint8_t dtype2;
uint8_t dsize2;
uint16_t vlan_id;
uint8_t dtype3;
uint8_t dsize3;
uint16_t last;
uint8_t rsrvd1[464];
uint16_t subsys_vid;
uint16_t subsys_did;
uint8_t rsrvd2[4];
} __packed q81_flash_t;
/*
* MPI Related
*/
#define Q81_NUM_MBX_REGISTERS 16
#define Q81_NUM_AEN_REGISTERS 9
#define Q81_FUNC0_MBX_IN_REG0 0x1180
#define Q81_FUNC0_MBX_OUT_REG0 0x1190
#define Q81_FUNC1_MBX_IN_REG0 0x1280
#define Q81_FUNC1_MBX_OUT_REG0 0x1290
#define Q81_MBX_NOP 0x0000
#define Q81_MBX_EXEC_FW 0x0002
#define Q81_MBX_REG_TEST 0x0006
#define Q81_MBX_VERIFY_CHKSUM 0x0007
#define Q81_MBX_ABOUT_FW 0x0008
#define Q81_MBX_RISC_MEMCPY 0x000A
#define Q81_MBX_LOAD_RISC_RAM 0x000B
#define Q81_MBX_DUMP_RISC_RAM 0x000C
#define Q81_MBX_WR_RAM_WORD 0x000D
#define Q81_MBX_INIT_RISC_RAM 0x000E
#define Q81_MBX_RD_RAM_WORD 0x000F
#define Q81_MBX_STOP_FW 0x0014
#define Q81_MBX_GEN_SYS_ERR 0x002A
#define Q81_MBX_WR_SFP_PLUS 0x0030
#define Q81_MBX_RD_SFP_PLUS 0x0031
#define Q81_MBX_INIT_FW 0x0060
#define Q81_MBX_GET_IFCB 0x0061
#define Q81_MBX_GET_FW_STATE 0x0069
#define Q81_MBX_IDC_REQ 0x0100
#define Q81_MBX_IDC_ACK 0x0101
#define Q81_MBX_IDC_TIME_EXTEND 0x0102
#define Q81_MBX_WOL_MODE 0x0110
#define Q81_MBX_SET_WOL_FILTER 0x0111
#define Q81_MBX_CLR_WOL_FILTER 0x0112
#define Q81_MBX_SET_WOL_MAGIC 0x0113
#define Q81_MBX_WOL_MODE_IMM 0x0115
#define Q81_MBX_PORT_RESET 0x0120
#define Q81_MBX_SET_PORT_CFG 0x0122
#define Q81_MBX_GET_PORT_CFG 0x0123
#define Q81_MBX_GET_LNK_STATUS 0x0124
#define Q81_MBX_SET_LED_CFG 0x0125
#define Q81_MBX_GET_LED_CFG 0x0126
#define Q81_MBX_SET_DCBX_CTLB 0x0130
#define Q81_MBX_GET_DCBX_CTLB 0x0131
#define Q81_MBX_GET_DCBX_TLV 0x0132
#define Q81_MBX_DIAG_CMDS 0x0150
#define Q81_MBX_SET_MGMT_CTL 0x0160
#define Q81_MBX_SET_MGMT_CTL_STOP 0x01
#define Q81_MBX_SET_MGMT_CTL_RESUME 0x02
#define Q81_MBX_GET_MGMT_CTL 0x0161
#define Q81_MBX_GET_MGMT_CTL_MASK ~0x3
#define Q81_MBX_GET_MGMT_CTL_FIFO_EMPTY 0x02
#define Q81_MBX_GET_MGMT_CTL_SET_MGMT 0x01
#define Q81_MBX_CMD_COMPLETE 0x4000
#define Q81_MBX_CMD_INVALID 0x4001
#define Q81_MBX_CMD_TEST_FAILED 0x4003
#define Q81_MBX_CMD_ERROR 0x4005
#define Q81_MBX_CMD_PARAM_ERROR 0x4006
#endif /* #ifndef _QLS_HW_H_ */
|