summaryrefslogtreecommitdiffstats
path: root/sys/dev/qlxge/qls_hw.h
blob: 6805f1e94a704f8673b5fc364f9e5984576a22b3 (plain)
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_ */
OpenPOWER on IntegriCloud