Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

   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
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
/*	$NetBSD: if_wmreg.h,v 1.130 2023/05/11 07:19:02 msaitoh Exp $	*/

/*
 * Copyright (c) 2001 Wasabi Systems, Inc.
 * All rights reserved.
 *
 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
 *
 * 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.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed for the NetBSD Project by
 *	Wasabi Systems, Inc.
 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
 *    or promote products derived from this software without specific prior
 *    written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
 * 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.
 */

/******************************************************************************

  Copyright (c) 2001-2012, Intel 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.

   3. Neither the name of the Intel Corporation nor the names of its
      contributors may be used to endorse or promote products derived from
      this software without specific prior written permission.

  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.

******************************************************************************/

/*
 * Register description for the Intel i82542 (``Wiseman''),
 * i82543 (``Livengood''), and i82544 (``Cordova'') Gigabit
 * Ethernet chips.
 */

/*
 * The wiseman supports 64-bit PCI addressing.  This structure
 * describes the address in descriptors.
 */
typedef struct wiseman_addr {
	uint32_t	wa_low;		/* low-order 32 bits */
	uint32_t	wa_high;	/* high-order 32 bits */
} __packed wiseman_addr_t;

/*
 * The Wiseman receive descriptor.
 *
 * The receive descriptor ring must be aligned to a 4K boundary,
 * and there must be an even multiple of 8 descriptors in the ring.
 */
typedef struct wiseman_rxdesc {
	volatile wiseman_addr_t	wrx_addr;	/* buffer address */

	volatile uint16_t	wrx_len;	/* buffer length */
	volatile uint16_t	wrx_cksum;	/* checksum (starting at PCSS)*/

	volatile uint8_t	wrx_status;	/* Rx status */
	volatile uint8_t	wrx_errors;	/* Rx errors */
	volatile uint16_t	wrx_special;	/* special field (VLAN, etc.) */
} __packed wiseman_rxdesc_t;

/* wrx_status bits */
#define	WRX_ST_DD	__BIT(0)	/* descriptor done */
#define	WRX_ST_EOP	__BIT(1)	/* end of packet */
#define	WRX_ST_IXSM	__BIT(2)	/* ignore checksum indication */
#define	WRX_ST_VP	__BIT(3)	/* VLAN packet */
#define	WRX_ST_BPDU	__BIT(4)	/* ??? */
#define	WRX_ST_TCPCS	__BIT(5)	/* TCP checksum performed */
#define	WRX_ST_IPCS	__BIT(6)	/* IP checksum performed */
#define	WRX_ST_PIF	__BIT(7)	/* passed in-exact filter */

/* wrx_error bits */
#define	WRX_ER_CE	__BIT(0)	/* CRC error */
#define	WRX_ER_SE	__BIT(1)	/* symbol error */
#define	WRX_ER_SEQ	__BIT(2)	/* sequence error */
#define	WRX_ER_ICE	__BIT(3)	/* ??? */
#define	WRX_ER_CXE	__BIT(4)	/* carrier extension error */
#define	WRX_ER_TCPE	__BIT(5)	/* TCP checksum error */
#define	WRX_ER_IPE	__BIT(6)	/* IP checksum error */
#define	WRX_ER_RXE	__BIT(7)	/* Rx data error */

/* wrx_special field for VLAN packets */
#define	WRX_VLAN_ID(x)	((x) & 0x0fff)	/* VLAN identifier */
#define	WRX_VLAN_CFI	__BIT(12)	/* Canonical Form Indicator */
#define	WRX_VLAN_PRI(x)	(((x) >> 13) & 7)/* VLAN priority field */

/* extended RX descriptor for 82574 */
typedef union ext_rxdesc {
	struct {
		uint64_t erxd_addr;	/* Packet Buffer Address */
		uint64_t erxd_dd;	/* 63:1 reserved, 0 DD */
	} erx_data;
	struct {
		uint32_t erxc_mrq;	/*
					 * 31:13 reserved
					 * 12:8 Rx queue associated with the packet
					 * 7:4 reserved 3:0 RSS Type
					 */
		uint32_t erxc_rsshash;	/* RSS Hash or {Fragment Checksum, IP identification } */
		uint32_t erxc_err_stat;	/* 31:20 Extended Error, 19:0 Extened Status */
		uint16_t erxc_pktlen;	/* PKT_LEN */
		uint16_t erxc_vlan;	/* VLAN Tag */
	} erx_ctx;
} __packed ext_rxdesc_t;

#define	EXTRXD_DD_MASK		__BIT(0)

/*
 * erxc_rsshash is used for below 2 patterns
 *     (1) Fragment Checksum and IP identification
 *         - Fragment Checksum is valid
 *           when RXCSUM.PCSD cleared and RXCSUM.IPPCSE bit is set
 *         - IP identification is valid
 *           when RXCSUM.PCSD cleared and RXCSUM.IPPCSE bit is set
 *     (2) RSS Hash
 *         when RXCSUM.PCSD bit is set
 */
#define	EXTRXC_IP_ID_MASK	__BITS(15,0)
#define	EXTRXC_FRAG_CSUM_MASK	__BITS(31,16)
#define	EXTRXC_IP_ID(rsshash)	__SHIFTOUT(rsshash,ERXC_IP_ID_MASK)
#define	EXTRXC_FRAG_CSUM(rsshash) __SHIFTOUT(rsshash,ERXC_FRAG_CSUM_MASK)

/* macros for nrxc_mrq */
#define	EXTRXC_RSS_TYPE_MASK		__BITS(3,0)
/* __BITS(7,4) is reserved */
#define	EXTRXC_QUEUE_MASK		__BITS(12,8)
/* __BITS(31,13) is reserved */
#define	EXTRXC_RSS_TYPE(mrq)	__SHIFTOUT(mrq,EXTRXC_RSS_TYPE_MASK)
#define	EXTRXC_QUEUE(mrq)	__SHIFTOUT(mrq,EXTRXC_QUEUE_MASK)

#define	EXTRXC_RSS_TYPE_NONE		0x0 /* No hash computation done. */
#define	EXTRXC_RSS_TYPE_TCP_IPV4	0x1
#define	EXTRXC_RSS_TYPE_IPV4		0x2
#define	EXTRXC_RSS_TYPE_TCP_IPV6	0x3
#define	EXTRXC_RSS_TYPE_IPV6_EX		0x4
#define	EXTRXC_RSS_TYPE_IPV6		0x5
/*0x6:0xF is reserved. */

#define	EXTRXC_STATUS_MASK	__BITS(19,0)
#define	EXTRXC_ERROR_MASK	__BITS(31,20)
#define	EXTRXC_STATUS(err_stat)	__SHIFTOUT(err_stat,EXTRXC_STATUS_MASK)
#define	EXTRXC_ERROR(err_stat)	__SHIFTOUT(err_stat,EXTRXC_ERROR_MASK)

/* 3:0 is reserved. */
#define	EXTRXC_ERROR_CE		__BIT(4) /* The same as WRX_ER_CE. */
#define	EXTRXC_ERROR_SE		__BIT(5) /* The same as WRX_ER_SE. */
#define	EXTRXC_ERROR_SEQ	__BIT(6) /* The same as WRX_ER_SEQ. */
/* 7 is reserved. */
#define	EXTRXC_ERROR_CXE	__BIT(8) /* The same as WRX_ER_CXE. */
#define	EXTRXC_ERROR_TCPE	__BIT(9) /* The same as WRX_ER_TCPE. */
#define	EXTRXC_ERROR_IPE	__BIT(10) /* The same as WRX_ER_IPE. */
#define	EXTRXC_ERROR_RXE	__BIT(11) /* The same as WRX_ER_RXE. */

#define	EXTRXC_STATUS_DD		__BIT(0) /* The same as WRX_ST_DD. */
#define	EXTRXC_STATUS_EOP		__BIT(1) /* The same as WRX_ST_EOP. */
/* 2 is reserved. */
#define	EXTRXC_STATUS_VP		__BIT(3) /* The same as WRX_ST_VP. */
#define	EXTRXC_STATUS_UDPCS		__BIT(4) /* UDP checksum calculated on packet. */
#define	EXTRXC_STATUS_TCPCS		__BIT(5) /* The same as WRX_ST_TCPCS. */
#define	EXTRXC_STATUS_IPCS		__BIT(6) /* The same as WRX_ST_IPCS. */
/* 7 is reserved. */
#define	EXTRXC_STATUS_TST		__BIT(8) /* Time stamp taken. */
#define	EXTRXC_STATUS_IPIDV		__BIT(9) /* IP identification valid. */
#define	EXTRXC_STATUS_UDPV		__BIT(10) /* Valid UDP XSUM. */
/* 14:11 is reserved. */
#define	EXTRXC_STATUS_ACK		__BIT(15) /* ACK packet indication. */
#define	EXTRXC_STATUS_PKTTYPE_MASK	__BITS(19,16)
#define	EXTRXC_STATUS_PKTTYPE(status)	__SHIFTOUT(status,EXTRXC_STATUS_PKTTYPE_MASK)

/* advanced RX descriptor for 82575 and newer */
typedef union nq_rxdesc {
	struct {
		uint64_t nrxd_paddr;	/* 63:1 Packet Buffer Address, 0 A0/NSE */
		uint64_t nrxd_haddr;	/* 63:1 HEader Buffer Address, 0 DD */
	} nqrx_data;
	struct {
		uint32_t nrxc_misc;	/*
					 * 31: SPH, 30:21 HDR_LEN[9:0],
					 * 20:19 HDR_LEN[11:10], 18:17 RSV,
					 * 16:4 Packet Type 3:0 RSS Type
					 */
		uint32_t nrxc_rsshash;	/* RSS Hash or {Fragment Checksum, IP identification } */
		uint32_t nrxc_err_stat;	/* 31:20 Extended Error, 19:0 Extened Status */
		uint16_t nrxc_pktlen;	/* PKT_LEN */
		uint16_t nrxc_vlan;	/* VLAN Tag */
	} nqrx_ctx;
} __packed nq_rxdesc_t;

/* for nrxd_paddr macros */
#define	NQRXD_A0_MASK		__BIT(0)
#define	NQRXD_NSE_MASK		__BIT(0)
#define	NQRXD_ADDR_MASK		__BITS(63,1)
/* for nrxd_haddr macros */
#define	NQRXD_DD_MASK		__BIT(0)

/*
 * nrxc_rsshash is used for below 2 patterns
 *     (1) Fragment Checksum and IP identification
 *         - Fragment Checksum is valid
 *           when RXCSUM.PCSD cleared and RXCSUM.IPPCSE bit is set
 *         - IP identification is valid
 *           when RXCSUM.PCSD cleared and RXCSUM.IPPCSE bit is set
 *     (2) RSS Hash
 *         when RXCSUM.PCSD bit is set
 */
#define	NQRXC_IP_ID_MASK	__BITS(15,0)
#define	NQRXC_FRAG_CSUM_MASK	__BITS(31,16)
#define	NQRXC_IP_ID(rsshash)	__SHIFTOUT(rsshash,NRXC_IP_ID_MASK)
#define	NQRXC_FRAG_CSUM(rsshash) __SHIFTOUT(rsshash,NRXC_FRAG_CSUM_MASK)

/* macros for nrxc_misc */
#define	NQRXC_RSS_TYPE_MASK		__BITS(3,0)
#define	NQRXC_PKT_TYPE_ID_MASK		__BITS(11,4)
#define	NQRXC_PKT_TYPE_ETQF_INDEX_MASK	__BITS(11,4)
#define	NQRXC_PKT_TYPE_ETQF_VALID_MASK	__BIT(15)
#define	NQRXC_PKT_TYPE_VLAN_MASK 	__BIT(16)
#define	NQRXC_PKT_TYPE_MASK		__BITS(16,4)
/* __BITS(18,17) is reserved */
#define	NQRXC_HDRLEN_HIGH_MASK		__BITS(20,19)
#define	NQRXC_HDRLEN_LOW_MASK		__BITS(30,21)
#define	NQRXC_SPH_MASK			__BIT(31)

#define	NQRXC_RSS_TYPE(misc)	__SHIFTOUT(misc,NQRXC_RSS_TYPE_MASK)
#define	NQRXC_PKT_TYPE_ID(pkttype) \
		__SHIFTOUT(pkttype,NQRXC_PKT_TYPE_ID_MASK)
#define	NQRXC_PKT_TYPE(misc)	__SHIFTOUT(misc,NQRXC_PKT_TYPE_MASK)
#define	NQRXC_PKT_TYPE_ETQF_INDEX(pkttype) \
		__SHIFTOUT(pkttype,NQRXC_PKT_TYPE_ETQF_INDEX_MASK)
#define	NQRXC_PKT_TYPE_ETQF_VALID NQRXC_PKT_TYPE_ETQF_VALID_MASK
#define	NQRXC_PKT_TYPE_VLAN	NQRXC_PKT_TYPE_VLAN_MASK
#define	NQRXC_HEADER_LEN(misc)	(__SHIFTOUT(misc,NQRXC_HDRLEN_LOW_MASK) \
		| __SHIFTOUT(misc,NQRXC_HDRLEN_HIGH_MASK) << 10)
#define	NQRXC_SPH		NQRXC_SPH_MASK

#define	NQRXC_RSS_TYPE_NONE		0x0 /* No hash computation done. */
#define	NQRXC_RSS_TYPE_TCP_IPV4		0x1
#define	NQRXC_RSS_TYPE_IPV4		0x2
#define	NQRXC_RSS_TYPE_TCP_IPV6		0x3
#define	NQRXC_RSS_TYPE_IPV6_EX		0x4
#define	NQRXC_RSS_TYPE_IPV6		0x5
#define	NQRXC_RSS_TYPE_TCP_IPV6_EX	0x6
#define	NQRXC_RSS_TYPE_UDP_IPV4		0x7
#define	NQRXC_RSS_TYPE_UDP_IPV6		0x8
#define	NQRXC_RSS_TYPE_UDP_IPV6_EX	0x9
/*0xA:0xF is reserved. */

#define	NQRXC_PKT_TYPE_IPV4		__BIT(0)
#define	NQRXC_PKT_TYPE_IPV4E		__BIT(1)
#define	NQRXC_PKT_TYPE_IPV6		__BIT(2)
#define	NQRXC_PKT_TYPE_IPV6E		__BIT(3)
#define	NQRXC_PKT_TYPE_TCP		__BIT(4)
#define	NQRXC_PKT_TYPE_UDP		__BIT(5)
#define	NQRXC_PKT_TYPE_SCTP		__BIT(6)
#define	NQRXC_PKT_TYPE_NFS		__BIT(7)

#define	NQRXC_STATUS_MASK	__BITS(19,0)
#define	NQRXC_ERROR_MASK	__BITS(31,20)
#define	NQRXC_STATUS(err_stat)	__SHIFTOUT(err_stat,NQRXC_STATUS_MASK)
#define	NQRXC_ERROR(err_stat)	__SHIFTOUT(err_stat,NQRXC_ERROR_MASK)

/* 2:0 is reserved. */
#define	NQRXC_ERROR_HB0		__BIT(3) /* Header Buffer Overflow. */
/* 6:4 is reserved. */
/* 8:7 is reserved. */
#define	NQRXC_ERROR_L4E		__BIT(9) /* L4 error indication. */
#define	NQRXC_ERROR_IPE		__BIT(10) /* The same as WRX_ER_IPE. */
#define	NQRXC_ERROR_RXE		__BIT(11) /* The same as WRX_ER_RXE. */
/* XXX Where is WRX_ER_CE, WRX_ER_SE, WRX_ER_SEQ, WRX_ER_CXE error? */

#define	NQRXC_STATUS_DD		__BIT(0) /* The same as WRX_ST_DD. */
#define	NQRXC_STATUS_EOP	__BIT(1) /* The same as WRX_ST_EOP. */
/* 2 is reserved */
#define	NQRXC_STATUS_VP		__BIT(3) /* The same as WRX_ST_VP. */
#define	NQRXC_STATUS_UDPCS	__BIT(4) /* UDP checksum or IP payload checksum. */
					 /* XXX in I210 spec, this bit is the same as WRX_ST_BPDU(is "???" comment) */
#define	NQRXC_STATUS_L4I	__BIT(5) /* L4 integrity check was done. */
#define	NQRXC_STATUS_IPCS	__BIT(6) /* The same as WRX_ST_IPCS. */
#define	NQRXC_STATUS_PIF	__BIT(7) /* The same as WRX_ST_PIF. */
/* 8 is reserved */
#define	NQRXC_STATUS_VEXT	__BIT(9) /* First VLAN is found on a bouble VLAN packet. */
#define	NQRXC_STATUS_UDPV	__BIT(10) /* The packet contains a valid checksum field in a first fragment UDP IPv4 packet. */
#define	NQRXC_STATUS_LLINT	__BIT(11) /* The packet caused an immediate interrupt. */
#define	NQRXC_STATUS_STRIPCRC	__BIT(12) /* Ethernet CRC is stripped. */
/* 14:13 is reserved */
#define	NQRXC_STATUS_TSIP	__BIT(15) /* Timestamp in packet. */
#define	NQRXC_STATUS_TS		__BIT(16) /* Time stamped packet. */
/* 17 is reserved */
#define	NQRXC_STATUS_LB		__BIT(18) /* Sent by a local virtual machine (VM to VM switch indication). */
#define	NQRXC_STATUS_MC		__BIT(19) /* Packet received from Manageability Controller */
					  /* "MBC" in i350 spec */

/*
 * The Wiseman transmit descriptor.
 *
 * The transmit descriptor ring must be aligned to a 4K boundary,
 * and there must be an even multiple of 8 descriptors in the ring.
 */
typedef struct wiseman_tx_fields {
	uint8_t wtxu_status;		/* Tx status */
	uint8_t wtxu_options;		/* options */
	uint16_t wtxu_vlan;		/* VLAN info */
} __packed wiseman_txfields_t;
typedef struct wiseman_txdesc {
	wiseman_addr_t	wtx_addr;	/* buffer address */
	uint32_t	wtx_cmdlen;	/* command and length */
	wiseman_txfields_t wtx_fields;	/* fields; see below */
} __packed wiseman_txdesc_t;

/* Commands for wtx_cmdlen */
#define	WTX_CMD_EOP	__BIT(24)	/* end of packet */
#define	WTX_CMD_IFCS	__BIT(25)	/* insert FCS */
#define	WTX_CMD_RS	__BIT(27)	/* report status */
#define	WTX_CMD_RPS	__BIT(28)	/* report packet sent */
#define	WTX_CMD_DEXT	__BIT(29)	/* descriptor extension */
#define	WTX_CMD_VLE	__BIT(30)	/* VLAN enable */
#define	WTX_CMD_IDE	__BIT(31)	/* interrupt delay enable */

/* Descriptor types (if DEXT is set) */
#define	WTX_DTYP_MASK	__BIT(20)
#define	WTX_DTYP_C	__SHIFTIN(0, WTX_DTYP_MASK)	/* context */
#define	WTX_DTYP_D	__SHIFTIN(1, WTX_DTYP_MASK)	/* data */

/* wtx_fields status bits */
#define	WTX_ST_DD	__BIT(0)	/* descriptor done */
#define	WTX_ST_EC	__BIT(1)	/* excessive collisions */
#define	WTX_ST_LC	__BIT(2)	/* late collision */
#define	WTX_ST_TU	__BIT(3)	/* transmit underrun */

/* wtx_fields option bits for IP/TCP/UDP checksum offload */
#define	WTX_IXSM	__BIT(0)	/* IP checksum offload */
#define	WTX_TXSM	__BIT(1)	/* TCP/UDP checksum offload */

/* Maximum payload per Tx descriptor */
#define	WTX_MAX_LEN	4096

/*
 * The Livengood TCP/IP context descriptor.
 */
struct livengood_tcpip_ctxdesc {
	uint32_t	tcpip_ipcs;	/* IP checksum context */
	uint32_t	tcpip_tucs;	/* TCP/UDP checksum context */
	uint32_t	tcpip_cmdlen;
	uint32_t	tcpip_seg;	/* TCP segmentation context */
};

/* commands for context descriptors */
#define	WTX_TCPIP_CMD_TCP	__BIT(24)	/* 1 = TCP, 0 = UDP */
#define	WTX_TCPIP_CMD_IP	__BIT(25)	/* 1 = IPv4, 0 = IPv6 */
#define	WTX_TCPIP_CMD_TSE	__BIT(26)	/* segmentation context valid */

#define	WTX_TCPIP_IPCSS(x)	((x) << 0)	/* checksum start */
#define	WTX_TCPIP_IPCSO(x)	((x) << 8)	/* checksum value offset */
#define	WTX_TCPIP_IPCSE(x)	((x) << 16)	/* checksum end */

#define	WTX_TCPIP_TUCSS(x)	((x) << 0)	/* checksum start */
#define	WTX_TCPIP_TUCSO(x)	((x) << 8)	/* checksum value offset */
#define	WTX_TCPIP_TUCSE(x)	((x) << 16)	/* checksum end */

#define	WTX_TCPIP_SEG_STATUS(x)	((x) << 0)
#define	WTX_TCPIP_SEG_HDRLEN(x)	((x) << 8)
#define	WTX_TCPIP_SEG_MSS(x)	((x) << 16)

/*
 * PCI config registers used by the Wiseman.
 */
#define	WM_PCI_MMBA	PCI_MAPREG_START
/* registers for FLASH access on ICH8 */
#define	WM_ICH8_FLASH	0x0014

#define	WM_PCI_LTR_CAP_LPT	0xa8

/* XXX Only for PCH_SPT? */
#define	WM_PCI_DESCRING_STATUS	0xe4
#define	DESCRING_STATUS_FLUSH_REQ	__BIT(8)

/*
 * Wiseman Control/Status Registers.
 */
#define	WMREG_CTRL	0x0000	/* Device Control Register */
#define	CTRL_FD		__BIT(0)	/* full duplex */
#define	CTRL_BEM	__BIT(1)	/* big-endian mode */
#define	CTRL_PRIOR	__BIT(2)	/* 0 = receive, 1 = fair */
#define	CTRL_GIO_M_DIS	__BIT(2)	/* disabl PCI master access */
#define	CTRL_LRST	__BIT(3)	/* link reset */
#define	CTRL_ASDE	__BIT(5)	/* auto speed detect enable */
#define	CTRL_SLU	__BIT(6)	/* set link up */
#define	CTRL_ILOS	__BIT(7)	/* invert loss of signal */
#define	CTRL_SPEED(x)	((x) << 8)	/* speed (Livengood) */
#define	CTRL_SPEED_10	CTRL_SPEED(0)
#define	CTRL_SPEED_100	CTRL_SPEED(1)
#define	CTRL_SPEED_1000	CTRL_SPEED(2)
#define	CTRL_SPEED_MASK	CTRL_SPEED(3)
#define	CTRL_FRCSPD	__BIT(11)	/* force speed (Livengood) */
#define	CTRL_FRCFDX	__BIT(12)	/* force full-duplex (Livengood) */
#define	CTRL_D_UD_EN	__BIT(13)	/* Dock/Undock enable */
#define	CTRL_D_UD_POL	__BIT(14)	/* Defined polarity of Dock/Undock indication in SDP[0] */
#define	CTRL_F_PHY_R 	__BIT(15)	/* Reset both PHY ports, through PHYRST_N pin */
#define	CTRL_EXTLINK_EN __BIT(16)	/* enable link status from external LINK_0 and LINK_1 pins */
#define	CTRL_LANPHYPC_OVERRIDE __BIT(16) /* SW control of LANPHYPC */
#define	CTRL_LANPHYPC_VALUE __BIT(17)	/* SW value of LANPHYPC */
#define	CTRL_SWDPINS_SHIFT	18
#define	CTRL_SWDPINS_MASK	0x0f
#define	CTRL_SWDPIN(x)		(1U << (CTRL_SWDPINS_SHIFT + (x)))
#define	CTRL_SWDPIO_SHIFT	22
#define	CTRL_SWDPIO_MASK	0x0f
#define	CTRL_SWDPIO(x)		(1U << (CTRL_SWDPIO_SHIFT + (x)))
#define	CTRL_MEHE	__BIT(19)	/* Memory Error Handling Enable(I217)*/
#define	CTRL_RST	__BIT(26)	/* device reset */
#define	CTRL_RFCE	__BIT(27)	/* Rx flow control enable */
#define	CTRL_TFCE	__BIT(28)	/* Tx flow control enable */
#define	CTRL_VME	__BIT(30)	/* VLAN Mode Enable */
#define	CTRL_PHY_RESET	__BIT(31)	/* PHY reset (Cordova) */

#define	WMREG_CTRL_SHADOW 0x0004	/* Device Control Register (shadow) */

#define	WMREG_STATUS	0x0008	/* Device Status Register */
#define	STATUS_FD	__BIT(0)	/* full duplex */
#define	STATUS_LU	__BIT(1)	/* link up */
#define	STATUS_TCKOK	__BIT(2)	/* Tx clock running */
#define	STATUS_RBCOK	__BIT(3)	/* Rx clock running */
#define	STATUS_FUNCID_SHIFT 2		/* 82546 function ID */
#define	STATUS_FUNCID_MASK  3		/* ... */
#define	STATUS_TXOFF	__BIT(4)	/* Tx paused */
#define	STATUS_TBIMODE	__BIT(5)	/* fiber mode (Livengood) */
#define	STATUS_SPEED	__BITS(7, 6)	/* speed indication */
#define	STATUS_SPEED_10	  0
#define	STATUS_SPEED_100  1
#define	STATUS_SPEED_1000 2
#define	STATUS_ASDV(x)	((x) << 8)	/* auto speed det. val. (Livengood) */
#define	STATUS_LAN_INIT_DONE __BIT(9)	/* Lan Init Completion by NVM */
#define	STATUS_MTXCKOK	__BIT(10)	/* MTXD clock running */
#define	STATUS_PHYRA	__BIT(10)	/* PHY Reset Asserted (PCH) */
#define	STATUS_PCI66	__BIT(11)	/* 66MHz bus (Livengood) */
#define	STATUS_BUS64	__BIT(12)	/* 64-bit bus (Livengood) */
#define	STATUS_2P5_SKU	__BIT(12)	/* Value of the 2.5GBE SKU strap */
#define	STATUS_PCIX_MODE __BIT(13)	/* PCIX mode (Cordova) */
#define	STATUS_2P5_SKU_OVER __BIT(13)	/* Value of the 2.5GBE SKU override */
#define	STATUS_PCIXSPD(x) ((x) << 14)	/* PCIX speed indication (Cordova) */
#define	STATUS_PCIXSPD_50_66   STATUS_PCIXSPD(0)
#define	STATUS_PCIXSPD_66_100  STATUS_PCIXSPD(1)
#define	STATUS_PCIXSPD_100_133 STATUS_PCIXSPD(2)
#define	STATUS_PCIXSPD_MASK    STATUS_PCIXSPD(3)
#define	STATUS_GIO_M_ENA __BIT(19)	/* GIO master enable */
#define	STATUS_DEV_RST_SET __BIT(20)	/* Device Reset Set */

/* Strapping Option Register (PCH_SPT and newer) */
#define	WMREG_STRAP	0x000c
#define	STRAP_NVMSIZE	__BITS(1, 6)
#define	STRAP_FREQ	__BITS(12, 13)
#define	STRAP_SMBUSADDR	__BITS(17, 23)

#define	WMREG_EECD	0x0010	/* EEPROM Control Register */
#define	EECD_SK		__BIT(0)	/* clock */
#define	EECD_CS		__BIT(1)	/* chip select */
#define	EECD_DI		__BIT(2)	/* data in */
#define	EECD_DO		__BIT(3)	/* data out */
#define	EECD_FWE(x)	((x) << 4)	/* flash write enable control */
#define	EECD_FWE_DISABLED EECD_FWE(1)
#define	EECD_FWE_ENABLED  EECD_FWE(2)
#define	EECD_EE_REQ	__BIT(6)	/* (shared) EEPROM request */
#define	EECD_EE_GNT	__BIT(7)	/* (shared) EEPROM grant */
#define	EECD_EE_PRES	__BIT(8)	/* EEPROM present */
#define	EECD_EE_SIZE	__BIT(9)	/* EEPROM size
					   (0 = 64 word, 1 = 256 word) */
#define	EECD_EE_AUTORD	__BIT(9)	/* auto read done */
#define	EECD_EE_ABITS	__BIT(10)	/* EEPROM address bits
					   (based on type) */
#define	EECD_EE_SIZE_EX_MASK __BITS(14,11) /* EEPROM size for new devices */
#define	EECD_EE_TYPE	__BIT(13)	/* EEPROM type
					   (0 = Microwire, 1 = SPI) */
#define	EECD_SEC1VAL	__BIT(22)	/* Sector One Valid */
#define	EECD_SEC1VAL_VALMASK (EECD_EE_AUTORD | EECD_EE_PRES) /* Valid Mask */

#define	WMREG_FEXTNVM6	0x0010	/* Future Extended NVM 6 */
#define	FEXTNVM6_REQ_PLL_CLK	__BIT(8)
#define	FEXTNVM6_ENABLE_K1_ENTRY_CONDITION __BIT(9)
#define	FEXTNVM6_K1_OFF_ENABLE	__BIT(31)

#define	WMREG_EERD	0x0014	/* EEPROM read */
#define	EERD_DONE	0x02    /* done bit */
#define	EERD_START	0x01	/* First bit for telling part to start operation */
#define	EERD_ADDR_SHIFT	2	/* Shift to the address bits */
#define	EERD_DATA_SHIFT	16	/* Offset to data in EEPROM read/write registers */

#define	WMREG_CTRL_EXT	0x0018	/* Extended Device Control Register */
#define	CTRL_EXT_NSICR		__BIT(0) /* Non Interrupt clear on read */
#define	CTRL_EXT_GPI_EN(x)	(1U << (x)) /* gpin interrupt enable */
#define	CTRL_EXT_NVMVS		__BITS(0, 1) /* NVM valid sector */
#define	CTRL_EXT_LPCD		__BIT(2) /* LCD Power Cycle Done */
#define	CTRL_EXT_SWDPINS_SHIFT	4
#define	CTRL_EXT_SWDPINS_MASK	0x0d
/* The bit order of the SW Definable pin is not 6543 but 3654! */
#define	CTRL_EXT_SWDPIN(x)	(1U << (CTRL_EXT_SWDPINS_SHIFT \
		+ ((x) == 3 ? 3 : ((x) - 4))))
#define	CTRL_EXT_SWDPIO_SHIFT	8
#define	CTRL_EXT_SWDPIO_MASK	0x0d
#define	CTRL_EXT_SWDPIO(x)	(1U << (CTRL_EXT_SWDPIO_SHIFT \
		+ ((x) == 3 ? 3 : ((x) - 4))))
#define	CTRL_EXT_FORCE_SMBUS	__BIT(11)  /* Force SMBus mode */
#define	CTRL_EXT_ASDCHK		__BIT(12) /* ASD check */
#define	CTRL_EXT_EE_RST		__BIT(13) /* EEPROM reset */
#define	CTRL_EXT_IPS		__BIT(14) /* invert power state bit 0 */
#define	CTRL_EXT_SPD_BYPS	__BIT(15) /* speed select bypass */
#define	CTRL_EXT_IPS1		__BIT(16) /* invert power state bit 1 */
#define	CTRL_EXT_RO_DIS		__BIT(17) /* relaxed ordering disabled */
#define	CTRL_EXT_SDLPE		__BIT(18) /* SerDes Low Power Enable */
#define	CTRL_EXT_DMA_DYN_CLK	__BIT(19) /* DMA Dynamic Gating Enable */
#define	CTRL_EXT_PHYPDEN	__BIT(20)
#define	CTRL_EXT_LINK_MODE_MASK		0x00c00000
#define	CTRL_EXT_LINK_MODE_GMII		0x00000000
#define	CTRL_EXT_LINK_MODE_KMRN		0x00000000
#define	CTRL_EXT_LINK_MODE_1000KX	0x00400000
#define	CTRL_EXT_LINK_MODE_SGMII	0x00800000
#define	CTRL_EXT_LINK_MODE_PCIX_SERDES	0x00800000
#define	CTRL_EXT_LINK_MODE_TBI		0x00c00000
#define	CTRL_EXT_LINK_MODE_PCIE_SERDES	0x00c00000
#define	CTRL_EXT_EIAME		__BIT(24) /* Extended Interrupt Auto Mask En */
#define	CTRL_EXT_I2C_ENA	0x02000000  /* I2C enable */
#define	CTRL_EXT_DRV_LOAD	0x10000000
#define	CTRL_EXT_PBA		__BIT(31) /* PBA Support */

#define	WMREG_MDIC	0x0020	/* MDI Control Register */
#define	MDIC_DATA(x)	((x) & 0xffff)
#define	MDIC_REGADD(x)	((x) << 16)
#define	MDIC_PHY_SHIFT	21
#define	MDIC_PHY_MASK	__BITS(25, 21)
#define	MDIC_PHYADD(x)	((x) << 21)

#define	MDIC_OP_RW_MASK	__BITS(27, 26)
#define	MDIC_OP_WRITE	__SHIFTIN(1, MDIC_OP_RW_MASK)
#define	MDIC_OP_READ	__SHIFTIN(2, MDIC_OP_RW_MASK)
#define	MDIC_READY	__BIT(28)
#define	MDIC_I		__BIT(29)	/* interrupt on MDI complete */
#define	MDIC_E		__BIT(30)	/* MDI error */
#define	MDIC_DEST	__BIT(31)	/* Destination */

#define	WMREG_SCTL	0x0024	/* SerDes Control - RW */
/*
 * These 4 macros are also used for other 8bit control registers on the
 * 82575
 */
#define	SCTL_CTL_READY  __BIT(31)
#define	SCTL_CTL_DATA_MASK 0x000000ff
#define	SCTL_CTL_ADDR_SHIFT 8
#define	SCTL_CTL_POLL_TIMEOUT 640
#define	SCTL_DISABLE_SERDES_LOOPBACK 0x0400

#define	WMREG_FEXTNVM4	0x0024	/* Future Extended NVM 4 - RW */
#define	FEXTNVM4_BEACON_DURATION	__BITS(2, 0)
#define	FEXTNVM4_BEACON_DURATION_8US	0x7
#define	FEXTNVM4_BEACON_DURATION_16US	0x3

#define	WMREG_FCAL	0x0028	/* Flow Control Address Low */
#define	FCAL_CONST	0x00c28001	/* Flow Control MAC addr low */

#define	WMREG_FEXTNVM	0x0028	/* Future Extended NVM register */
#define	FEXTNVM_SW_CONFIG	__BIT(0)  /* SW PHY Config En (ICH8 B0) */
#define	FEXTNVM_SW_CONFIG_ICH8M	__BIT(27) /* SW PHY Config En (>= ICH8 B1) */

#define	WMREG_FCAH	0x002c	/* Flow Control Address High */
#define	FCAH_CONST	0x00000100	/* Flow Control MAC addr high */

#define	WMREG_FCT	0x0030	/* Flow Control Type */

#define	WMREG_KUMCTRLSTA 0x0034	/* MAC-PHY interface - RW */
#define	KUMCTRLSTA_MASK			0x0000ffff
#define	KUMCTRLSTA_OFFSET		0x001f0000
#define	KUMCTRLSTA_OFFSET_SHIFT		16
#define	KUMCTRLSTA_REN			0x00200000

#define	KUMCTRLSTA_OFFSET_FIFO_CTRL	0x00000000
#define	KUMCTRLSTA_OFFSET_CTRL		0x00000001
#define	KUMCTRLSTA_OFFSET_INB_CTRL	0x00000002
#define	KUMCTRLSTA_OFFSET_DIAG		0x00000003
#define	KUMCTRLSTA_OFFSET_TIMEOUTS	0x00000004
#define	KUMCTRLSTA_OFFSET_K1_CONFIG	0x00000007
#define	KUMCTRLSTA_OFFSET_INB_PARAM	0x00000009
#define	KUMCTRLSTA_OFFSET_HD_CTRL	0x00000010
#define	KUMCTRLSTA_OFFSET_M2P_SERDES	0x0000001e
#define	KUMCTRLSTA_OFFSET_M2P_MODES	0x0000001f

/* FIFO Control */
#define	KUMCTRLSTA_FIFO_CTRL_RX_BYPASS	0x0008
#define	KUMCTRLSTA_FIFO_CTRL_TX_BYPASS	0x0800

/* In-Band Control */
#define	KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT 0x0500
#define	KUMCTRLSTA_INB_CTRL_DIS_PADDING	0x0010

/* Diag */
#define	KUMCTRLSTA_DIAG_NELPBK	0x1000

/* K1 Config */
#define	KUMCTRLSTA_K1_ENABLE	0x0002

/* Half-Duplex Control */
#define	KUMCTRLSTA_HD_CTRL_10_100_DEFAULT 0x0004
#define	KUMCTRLSTA_HD_CTRL_1000_DEFAULT	0x0000

/* M2P Modes */
#define	KUMCTRLSTA_OPMODE_MASK	0x000c
#define	KUMCTRLSTA_OPMODE_INBAND_MDIO 0x0004

#define	WMREG_CONNSW	0x0034	/* Copper/Fiber Switch Control (>= 82575) */
#define	CONNSW_AUTOSENSE_EN	__BIT(0)	/* Auto Sense Enable */
#define	CONNSW_AUTOSENSE_CONF	__BIT(1)	/* Auto Sense Config Mode */
#define	CONNSW_ENRGSRC		__BIT(2)	/* SerDes Energy Detect Src */
#define	CONNSW_SERDESD		__BIT(9)	/* SerDes Signal Detect Ind. */
#define	CONNSW_PHYSD		__BIT(10)	/* PHY Signal Detect Ind. */
#define	CONNSW_PHY_PDN		__BIT(11)	/* Internal PHY in powerdown */

#define	WMREG_VET	0x0038	/* VLAN Ethertype */
#define	WMREG_MDPHYA	0x003c	/* PHY address - RW */

#define	WMREG_FEXTNVM3	0x003c	/* Future Extended NVM 3 */
#define	FEXTNVM3_PHY_CFG_COUNTER_MASK	__BITS(27, 26)
#define	FEXTNVM3_PHY_CFG_COUNTER_50MS	__BIT(27)

#define	WMREG_RAL(x)		(0x0040	+ ((x) * 8)) /* Receive Address List */
#define	WMREG_RAH(x)		(WMREG_RAL(x) + 4)
#define	WMREG_CORDOVA_RAL(x)	(((x) <= 15) ? (0x5400 + ((x) * 8)) : \
	    (0x54e0 + (((x) - 16) * 8)))
#define	WMREG_CORDOVA_RAH(x)	(WMREG_CORDOVA_RAL(x) + 4)
#define	WMREG_SHRAL(x)		(0x5438 + ((x) * 8))
#define	WMREG_SHRAH(x)		(WMREG_PCH_LPT_SHRAL(x) + 4)
#define	WMREG_PCH_LPT_SHRAL(x)	(0x5408 + ((x) * 8))
#define	WMREG_PCH_LPT_SHRAH(x)	(WMREG_PCH_LPT_SHRAL(x) + 4)
#define	WMREG_RAL_LO(b, x) ((b) + ((x) << 3))
#define	WMREG_RAL_HI(b, x) (WMREG_RAL_LO(b, x) + 4)
	/*
	 * Receive Address List: The LO part is the low-order 32-bits
	 * of the MAC address.  The HI part is the high-order 16-bits
	 * along with a few control bits.
	 */
#define	RAL_AS(x)	((x) << 16)	/* address select */
#define	RAL_AS_DEST	RAL_AS(0)	/* (cordova?) */
#define	RAL_AS_SOURCE	RAL_AS(1)	/* (cordova?) */
#define	RAL_RDR1	__BIT(30)	/* put packet in alt. rx ring */
#define	RAL_AV		__BIT(31)	/* entry is valid */

#define	WM_RAL_TABSIZE		15	/* RAL size for old devices */
#define	WM_RAL_TABSIZE_ICH8	7	/* RAL size for ICH* and PCH* */
#define	WM_RAL_TABSIZE_PCH2	5	/* RAL size for PCH2 */
#define	WM_RAL_TABSIZE_PCH_LPT	12	/* RAL size for PCH_LPT */
#define	WM_RAL_TABSIZE_82575	16	/* RAL size for 82575 */
#define	WM_RAL_TABSIZE_82576	24	/* RAL size for 82576 and 82580 */
#define	WM_RAL_TABSIZE_I350	32	/* RAL size for I350 */

#define	WMREG_ICR	0x00c0	/* Interrupt Cause Register */
#define	ICR_TXDW	__BIT(0)	/* Tx desc written back */
#define	ICR_TXQE	__BIT(1)	/* Tx queue empty */
#define	ICR_LSC		__BIT(2)	/* link status change */
#define	ICR_RXSEQ	__BIT(3)	/* receive sequence error */
#define	ICR_RXDMT0	__BIT(4)	/* Rx ring 0 nearly empty */
#define	ICR_RXO		__BIT(6)	/* Rx overrun */
#define	ICR_RXT0	__BIT(7)	/* Rx ring 0 timer */
#define	ICR_MDAC	__BIT(9)	/* MDIO access complete */
#define	ICR_RXCFG	__BIT(10)	/* Receiving /C/ */
#define	ICR_GPI(x)	__BIT(11+(x))	/* general purpose interrupts */
#define	ICR_RXQ(x)	__BIT(20+(x))	/* 82574: Rx queue x interrupt x=0,1 */
#define	ICR_TXQ(x)	__BIT(22+(x))	/* 82574: Tx queue x interrupt x=0,1 */
#define	ICR_OTHER	__BIT(24)	/* 82574: Other interrupt */
#define	ICR_INT		__BIT(31)	/* device generated an interrupt */

#define	WMREG_ITR	0x00c4	/* Interrupt Throttling Register */
#define	ITR_IVAL_MASK	0xffff		/* Interval mask */
#define	ITR_IVAL_SHIFT	0		/* Interval shift */

#define	WMREG_ICS	0x00c8	/* Interrupt Cause Set Register */
	/* See ICR bits. */

#define	WMREG_IMS	0x00d0	/* Interrupt Mask Set Register */
	/* See ICR bits. */

#define	WMREG_IMC	0x00d8	/* Interrupt Mask Clear Register */
	/* See ICR bits. */

#define	WMREG_EIAC_82574 0x00dc	/* Interrupt Auto Clear Register */
#define	WMREG_EIAC_82574_MSIX_MASK	(ICR_RXQ(0) | ICR_RXQ(1)	\
	    | ICR_TXQ(0) | ICR_TXQ(1) | ICR_OTHER)

#define	WMREG_FEXTNVM7	0x00e4  /* Future Extended NVM 7 */
#define	FEXTNVM7_SIDE_CLK_UNGATE __BIT(2)
#define	FEXTNVM7_DIS_SMB_PERST	__BIT(5)
#define	FEXTNVM7_DIS_PB_READ	__BIT(18)

#define	WMREG_IVAR	0x00e4  /* Interrupt Vector Allocation Register */
#define	WMREG_IVAR0	0x01700 /* Interrupt Vector Allocation */
#define	IVAR_ALLOC_MASK  __BITS(0, 6)	/* Bit 5 and 6 are reserved */
#define	IVAR_VALID       __BIT(7)
/* IVAR definitions for 82580 and newer */
#define	WMREG_IVAR_Q(x)	(WMREG_IVAR0 + ((x) / 2) * 4)
#define	IVAR_TX_MASK_Q(x) (0x000000ffUL << (((x) % 2) == 0 ? 8 : 24))
#define	IVAR_RX_MASK_Q(x) (0x000000ffUL << (((x) % 2) == 0 ? 0 : 16))
/* IVAR definitions for 82576 */
#define	WMREG_IVAR_Q_82576(x)	(WMREG_IVAR0 + ((x) & 0x7) * 4)
#define	IVAR_TX_MASK_Q_82576(x) (0x000000ffUL << (((x) / 8) == 0 ? 8 : 24))
#define	IVAR_RX_MASK_Q_82576(x) (0x000000ffUL << (((x) / 8) == 0 ? 0 : 16))
/* IVAR definitions for 82574 */
#define	IVAR_ALLOC_MASK_82574	__BITS(0, 2)
#define	IVAR_VALID_82574	__BIT(3)
#define	IVAR_TX_MASK_Q_82574(x) (0x0000000fUL << ((x) == 0 ? 8 : 12))
#define	IVAR_RX_MASK_Q_82574(x) (0x0000000fUL << ((x) == 0 ? 0 : 4))
#define	IVAR_OTHER_MASK		__BITS(16, 19)
#define	IVAR_INT_ON_ALL_WB	__BIT(31)

#define	WMREG_IVAR_MISC	0x01740 /* IVAR for other causes */
#define	IVAR_MISC_TCPTIMER __BITS(0, 7)
#define	IVAR_MISC_OTHER	__BITS(8, 15)

#define	WMREG_SVCR	0x00f0
#define	SVCR_OFF_EN		__BIT(0)
#define	SVCR_OFF_MASKINT	__BIT(12)

#define	WMREG_SVT	0x00f4
#define	SVT_OFF_HWM		__BITS(4, 0)

#define	WMREG_LTRV	0x00f8	/* Latency Tolerance Reporting */
#define	LTRV_VALUE	__BITS(9, 0)
#define	LTRV_SCALE	__BITS(12, 10)
#define	LTRV_SCALE_MAX	5
#define	LTRV_SNOOP_REQ	__BIT(15)
#define	LTRV_SEND	__BIT(30)
#define	LTRV_NONSNOOP	__BITS(31, 16)
#define	LTRV_NONSNOOP_REQ __BIT(31)

#define	WMREG_RCTL	0x0100	/* Receive Control */
#define	RCTL_EN		__BIT(1)	/* receiver enable */
#define	RCTL_SBP	__BIT(2)	/* store bad packets */
#define	RCTL_UPE	__BIT(3)	/* unicast promisc. enable */
#define	RCTL_MPE	__BIT(4)	/* multicast promisc. enable */
#define	RCTL_LPE	__BIT(5)	/* large packet enable */
#define	RCTL_LBM(x)	((x) << 6)	/* loopback mode */
#define	RCTL_LBM_NONE	RCTL_LBM(0)
#define	RCTL_LBM_PHY	RCTL_LBM(3)
#define	RCTL_RDMTS(x)	((x) << 8)	/* receive desc. min thresh size */
#define	RCTL_RDMTS_1_2	RCTL_RDMTS(0)
#define	RCTL_RDMTS_1_4	RCTL_RDMTS(1)
#define	RCTL_RDMTS_1_8	RCTL_RDMTS(2)
#define	RCTL_RDMTS_MASK	RCTL_RDMTS(3)
#define	RCTL_DTYP_MASK	__BITS(11,10)	/* descriptor type. 82574 only */
#define	RCTL_DTYP(x)	__SHIFTIN(x,RCTL_DTYP_MASK)
#define	RCTL_DTYP_ONEBUF RCTL_DTYP(0)	/* use one buffer(not split header). */
#define	RCTL_DTYP_SPH	RCTL_DTYP(1)	/* split header buffer. */
					/* RCTL_DTYP(2) and RCTL_DTYP(3) are reserved. */
#define	RCTL_MO		__BITS(13, 12)	/* multicast offset */
#define	RCTL_BAM	__BIT(15)	/* broadcast accept mode */
#define	RCTL_RDMTS_HEX	__BIT(16)
#define	RCTL_2k		(0 << 16)	/* 2k Rx buffers */
#define	RCTL_1k		(1 << 16)	/* 1k Rx buffers */
#define	RCTL_512	(2 << 16)	/* 512 byte Rx buffers */
#define	RCTL_256	(3 << 16)	/* 256 byte Rx buffers */
#define	RCTL_BSEX_16k	(1 << 16)	/* 16k Rx buffers (BSEX) */
#define	RCTL_BSEX_8k	(2 << 16)	/* 8k Rx buffers (BSEX) */
#define	RCTL_BSEX_4k	(3 << 16)	/* 4k Rx buffers (BSEX) */
#define	RCTL_DPF	__BIT(22)	/* discard pause frames */
#define	RCTL_PMCF	__BIT(23)	/* pass MAC control frames */
#define	RCTL_BSEX	__BIT(25)	/* buffer size extension (Livengood) */
#define	RCTL_SECRC	__BIT(26)	/* strip Ethernet CRC */

#define	WMREG_OLD_RDTR0	0x0108	/* Receive Delay Timer (ring 0) */
#define	WMREG_RDTR	0x2820
#define	RDTR_FPD	__BIT(31)	/* flush partial descriptor */

#define	WMREG_LTRC	0x01a0	/* Latency Tolerance Reportiong Control */

#define	WMREG_OLD_RDBAL0 0x0110	/* Receive Descriptor Base Low (ring 0) */
#define	WMREG_RDBAL(x) \
	((x) < 4 ? (0x02800 + ((x) * 0x100)) :	\
	    (0x0c000 + ((x) * 0x40)))

#define	WMREG_OLD_RDBAH0 0x0114	/* Receive Descriptor Base High (ring 0) */
#define	WMREG_RDBAH(x) \
	((x) < 4 ? (0x02804 + ((x) * 0x100)) :	\
	    (0x0c004 + ((x) * 0x40)))

#define	WMREG_OLD_RDLEN0 0x0118	/* Receive Descriptor Length (ring 0) */
#define	WMREG_RDLEN(x) \
	((x) < 4 ? (0x02808 + ((x) * 0x100)) :  \
	    (0x0c008 + ((x) * 0x40)))

#define	WMREG_SRRCTL(x) \
	((x) < 4 ? (0x0280c + ((x) * 0x100)) :	\
	    (0x0c00c + ((x) * 0x40)))	/* additional recv control used in 82575 ... */
#define	SRRCTL_BSIZEPKT_MASK		0x0000007f
#define	SRRCTL_BSIZEPKT_SHIFT		10	/* Shift _right_ */
#define	SRRCTL_BSIZEHDRSIZE_MASK	0x00000f00
#define	SRRCTL_BSIZEHDRSIZE_SHIFT	2	/* Shift _left_ */
#define	SRRCTL_DESCTYPE_LEGACY		0x00000000
#define	SRRCTL_DESCTYPE_ADV_ONEBUF	(1U << 25)
#define	SRRCTL_DESCTYPE_HDR_SPLIT	(2U << 25)
#define	SRRCTL_DESCTYPE_HDR_REPLICATION	(3U << 25)
#define	SRRCTL_DESCTYPE_HDR_REPLICATION_LARGE_PKT (4U << 25)
#define	SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS (5U << 25) /* 82575 only */
#define	SRRCTL_DESCTYPE_MASK		(7U << 25)
#define	SRRCTL_DROP_EN			0x80000000

#define	WMREG_OLD_RDH0	0x0120	/* Receive Descriptor Head (ring 0) */
#define	WMREG_RDH(x) \
	((x) < 4 ? (0x02810 + ((x) * 0x100)) :  \
	    (0x0c010 + ((x) * 0x40)))

#define	WMREG_OLD_RDT0	0x0128	/* Receive Descriptor Tail (ring 0) */
#define	WMREG_RDT(x) \
	((x) < 4 ? (0x02818 + ((x) * 0x100)) :	\
	    (0x0c018 + ((x) * 0x40)))

#define	WMREG_RXDCTL(x) \
	((x) < 4 ? (0x02828 + ((x) * 0x100)) :	\
	    (0x0c028 + ((x) * 0x40)))	/* Receive Descriptor Control */
#define	RXDCTL_PTHRESH(x) ((x) << 0)	/* prefetch threshold */
#define	RXDCTL_HTHRESH(x) ((x) << 8)	/* host threshold */
#define	RXDCTL_WTHRESH(x) ((x) << 16)	/* write back threshold */
#define	RXDCTL_GRAN	__BIT(24)	/* 0 = cacheline, 1 = descriptor */
/* flags used starting with 82575 ... */
#define	RXDCTL_QUEUE_ENABLE  0x02000000 /* Enable specific Tx Queue */
#define	RXDCTL_SWFLSH        0x04000000 /* Rx Desc. write-back flushing */

#define	WMREG_OLD_RDTR1	0x0130	/* Receive Delay Timer (ring 1) */
#define	WMREG_OLD_RDBA1_LO 0x0138 /* Receive Descriptor Base Low (ring 1) */
#define	WMREG_OLD_RDBA1_HI 0x013c /* Receive Descriptor Base High (ring 1) */
#define	WMREG_OLD_RDLEN1 0x0140	/* Receive Drscriptor Length (ring 1) */
#define	WMREG_OLD_RDH1	0x0148
#define	WMREG_OLD_RDT1	0x0150
#define	WMREG_OLD_FCRTH 0x0160	/* Flow Control Rx Threshold Hi (OLD) */
#define	WMREG_FCRTH	0x2168	/* Flow Control Rx Threhsold Hi */
#define	FCRTH_DFLT	0x00008000

#define	WMREG_OLD_FCRTL 0x0168	/* Flow Control Rx Threshold Lo (OLD) */
#define	WMREG_FCRTL	0x2160	/* Flow Control Rx Threshold Lo */
#define	FCRTL_DFLT	0x00004000
#define	FCRTL_XONE	0x80000000	/* Enable XON frame transmission */

#define	WMREG_FCTTV	0x0170	/* Flow Control Transmit Timer Value */
#define	FCTTV_DFLT	0x00000600

#define	WMREG_TXCW	0x0178	/* Transmit Configuration Word (TBI mode) */
	/* See MII ANAR_X bits. */
#define	TXCW_FD		__BIT(5)	/* Full Duplex */
#define	TXCW_HD		__BIT(6)	/* Half Duplex */
#define	TXCW_SYM_PAUSE	__BIT(7)	/* sym pause request */
#define	TXCW_ASYM_PAUSE	__BIT(8)	/* asym pause request */
#define	TXCW_TxConfig	__BIT(30)	/* Tx Config */
#define	TXCW_ANE	__BIT(31)	/* Autonegotiate */

#define	WMREG_RXCW	0x0180	/* Receive Configuration Word (TBI mode) */
	/* See MII ANLPAR_X bits. */
#define	RXCW_NC		__BIT(26)	/* no carrier */
#define	RXCW_IV		__BIT(27)	/* config invalid */
#define	RXCW_CC		__BIT(28)	/* config change */
#define	RXCW_C		__BIT(29)	/* /C/ reception */
#define	RXCW_SYNCH	__BIT(30)	/* synchronized */
#define	RXCW_ANC	__BIT(31)	/* autonegotiation complete */

#define	WMREG_MTA	0x0200	/* Multicast Table Array */
#define	WMREG_CORDOVA_MTA 0x5200

#define	WMREG_TCTL	0x0400	/* Transmit Control Register */
#define	TCTL_EN		__BIT(1)	/* transmitter enable */
#define	TCTL_PSP	__BIT(3)	/* pad short packets */
#define	TCTL_CT(x)	(((x) & 0xff) << 4)   /* 4:11 - collision threshold */
#define	TCTL_COLD(x)	(((x) & 0x3ff) << 12) /* 12:21 - collision distance */
#define	TCTL_SWXOFF	__BIT(22)	/* software XOFF */
#define	TCTL_RTLC	__BIT(24)	/* retransmit on late collision */
#define	TCTL_NRTU	__BIT(25)	/* no retransmit on underrun */
#define	TCTL_MULR	__BIT(28)	/* multiple request */

#define	TX_COLLISION_THRESHOLD		15
#define	TX_COLLISION_DISTANCE_HDX	512
#define	TX_COLLISION_DISTANCE_FDX	64

#define	WMREG_TCTL_EXT	0x0404	/* Transmit Control Register */
#define	TCTL_EXT_BST_MASK	0x000003ff /* Backoff Slot Time */
#define	TCTL_EXT_GCEX_MASK	0x000ffc00 /* Gigabit Carry Extend Padding */

#define	DEFAULT_80003ES2LAN_TCTL_EXT_GCEX 0x00010000

#define	WMREG_TIPG	0x0410	/* Transmit IPG Register */
#define	TIPG_IPGT_MASK	__BITS(0, 9)	/* IPG transmit time MASK */
#define	TIPG_IPGT(x)	__SHIFTIN((x), TIPG_IPGT_MASK) /* IPG transmit time */
#define	TIPG_IPGR1(x)	((x) << 10)	/* IPG receive time 1 */
#define	TIPG_IPGR2(x)	((x) << 20)	/* IPG receive time 2 */
#define	TIPG_WM_DFLT	(TIPG_IPGT(0x0a) | TIPG_IPGR1(0x02) | TIPG_IPGR2(0x0a))
#define	TIPG_LG_DFLT	(TIPG_IPGT(0x06) | TIPG_IPGR1(0x08) | TIPG_IPGR2(0x06))
#define	TIPG_1000T_DFLT	(TIPG_IPGT(0x08) | TIPG_IPGR1(0x08) | TIPG_IPGR2(0x06))
#define	TIPG_1000T_80003_DFLT \
    (TIPG_IPGT(0x08) | TIPG_IPGR1(0x02) | TIPG_IPGR2(0x07))
#define	TIPG_10_100_80003_DFLT \
    (TIPG_IPGT(0x09) | TIPG_IPGR1(0x02) | TIPG_IPGR2(0x07))

#define	WMREG_TQC	0x0418

#define	WMREG_OLD_TDBAL	0x0420	/* Transmit Descriptor Base Lo */
#define	WMREG_TDBAL(x) \
	((x) < 4 ? (0x03800 + ((x) * 0x100)) :	\
	    (0x0e000 + ((x) * 0x40)))

#define	WMREG_OLD_TDBAH	0x0424	/* Transmit Descriptor Base Hi */
#define	WMREG_TDBAH(x)\
	((x) < 4 ? (0x03804 + ((x) * 0x100)) :	\
	    (0x0e004 + ((x) * 0x40)))

#define	WMREG_OLD_TDLEN	0x0428	/* Transmit Descriptor Length */
#define	WMREG_TDLEN(x) \
	((x) < 4 ? (0x03808 + ((x) * 0x100)) :	\
	    (0x0e008 + ((x) * 0x40)))

#define	WMREG_OLD_TDH	0x0430	/* Transmit Descriptor Head */
#define	WMREG_TDH(x) \
	((x) < 4 ? (0x03810 + ((x) * 0x100)) :	\
	    (0x0e010 + ((x) * 0x40)))

#define	WMREG_OLD_TDT	0x0438	/* Transmit Descriptor Tail */
#define	WMREG_TDT(x) \
	((x) < 4 ? (0x03818 + ((x) * 0x100)) :	\
	    (0x0e018 + ((x) * 0x40)))

#define	WMREG_OLD_TIDV	0x0440	/* Transmit Delay Interrupt Value */
#define	WMREG_TIDV	0x3820

#define	WMREG_AIT	0x0458	/* Adaptive IFS Throttle */
#define	WMREG_VFTA	0x0600

#define	WMREG_LEDCTL	0x0e00	/* LED Control - RW */

#define	WMREG_MDICNFG	0x0e04	/* MDC/MDIO Configuration Register */
#define	MDICNFG_PHY_SHIFT	21
#define	MDICNFG_PHY_MASK	__BITS(25, 21)
#define	MDICNFG_COM_MDIO	__BIT(30)
#define	MDICNFG_DEST		__BIT(31)

#define	WM_MC_TABSIZE	128
#define	WM_ICH8_MC_TABSIZE 32
#define	WM_VLAN_TABSIZE	128

#define	WMREG_PHPM	0x0e14	/* PHY Power Management */
#define	PHPM_SPD_EN		__BIT(0)	/* Smart Power Down */
#define	PHPM_D0A_LPLU		__BIT(1)	/* D0 Low Power Link Up */
#define	PHPM_NOND0A_LPLU	__BIT(2)	/* Non-D0a LPLU */
#define	PHPM_NOND0A_GBE_DIS	__BIT(3)	/* Disable 1G in non-D0a */
#define	PHPM_GO_LINK_D		__BIT(5)	/* Go Link Disconnect */

#define	WMREG_EEER	0x0e30	/* Energy Efficiency Ethernet "EEE" */
#define	EEER_TX_LPI_EN		0x00010000 /* EEER Tx LPI Enable */
#define	EEER_RX_LPI_EN		0x00020000 /* EEER Rx LPI Enable */
#define	EEER_LPI_FC		0x00040000 /* EEER Ena on Flow Cntrl */
#define	EEER_EEER_NEG		0x20000000 /* EEER capability nego */
#define	EEER_EEER_RX_LPI_STATUS	0x40000000 /* EEER Rx in LPI state */
#define	EEER_EEER_TX_LPI_STATUS	0x80000000 /* EEER Tx in LPI state */
#define	WMREG_EEE_SU	0x0e34	/* EEE Setup */
#define	WMREG_IPCNFG	0x0e38	/* Internal PHY Configuration */
#define	IPCNFG_10BASE_TE	0x00000002 /* IPCNFG 10BASE-Te low power op. */
#define	IPCNFG_EEE_100M_AN	0x00000004 /* IPCNFG EEE Ena 100M AN */
#define	IPCNFG_EEE_1G_AN	0x00000008 /* IPCNFG EEE Ena 1G AN */

#define	WMREG_EXTCNFCTR	0x0f00  /* Extended Configuration Control */
#define	EXTCNFCTR_PCIE_WRITE_ENABLE	0x00000001
#define	EXTCNFCTR_OEM_WRITE_ENABLE	0x00000008
#define	EXTCNFCTR_MDIO_SW_OWNERSHIP	0x00000020
#define	EXTCNFCTR_MDIO_HW_OWNERSHIP	0x00000040
#define	EXTCNFCTR_GATE_PHY_CFG		0x00000080
#define	EXTCNFCTR_EXT_CNF_POINTER	0x0fff0000

#define	WMREG_EXTCNFSIZE 0x0f08  /* Extended Configuration Size */
#define	EXTCNFSIZE_LENGTH	__BITS(23, 16)

#define	WMREG_PHY_CTRL	0x0f10	/* PHY control */
#define	PHY_CTRL_SPD_EN		(1 << 0)
#define	PHY_CTRL_D0A_LPLU	(1 << 1)
#define	PHY_CTRL_NOND0A_LPLU	(1 << 2)
#define	PHY_CTRL_NOND0A_GBE_DIS	(1 << 3)
#define	PHY_CTRL_GBE_DIS	(1 << 6)

#define	WMREG_PCIEANACFG 0x0f18	/* PCIE Analog Config */

#define	WMREG_IOSFPC	0x0f28	/* Tx corrupted data */

#define	WMREG_PBA	0x1000	/* Packet Buffer Allocation */
#define	PBA_BYTE_SHIFT	10		/* KB -> bytes */
#define	PBA_ADDR_SHIFT	7		/* KB -> quadwords */
#define	PBA_8K		0x0008
#define	PBA_10K		0x000a
#define	PBA_12K		0x000c
#define	PBA_14K		0x000e
#define	PBA_16K		0x0010		/* 16K, default Tx allocation */
#define	PBA_20K		0x0014
#define	PBA_22K		0x0016
#define	PBA_24K		0x0018
#define	PBA_26K		0x001a
#define	PBA_30K		0x001e
#define	PBA_32K		0x0020
#define	PBA_34K		0x0022
#define	PBA_35K		0x0023
#define	PBA_40K		0x0028
#define	PBA_48K		0x0030		/* 48K, default Rx allocation */
#define	PBA_64K		0x0040
#define	PBA_RXA_MASK	__BITS(15, 0)

#define	WMREG_PBS	0x1008	/* Packet Buffer Size (ICH) */

#define	WMREG_PBECCSTS	0x100c	/* Packet Buffer ECC Status (PCH_LPT) */
#define	PBECCSTS_CORR_ERR_CNT_MASK	0x000000ff
#define	PBECCSTS_UNCORR_ERR_CNT_MASK	0x0000ff00
#define	PBECCSTS_UNCORR_ECC_ENABLE	0x00010000

#define	WMREG_EEMNGCTL	0x1010	/* MNG EEprom Control */
#define	EEMNGCTL_CFGDONE_0 0x040000	/* MNG config cycle done */
#define	EEMNGCTL_CFGDONE_1 0x080000	/*  2nd port */

#define	WMREG_I2CCMD	0x1028	/* SFPI2C Command Register - RW */
#define	I2CCMD_REG_ADDR_SHIFT	16
#define	I2CCMD_REG_ADDR		0x00ff0000
#define	I2CCMD_PHY_ADDR_SHIFT	24
#define	I2CCMD_PHY_ADDR		0x07000000
#define	I2CCMD_OPCODE_READ	0x08000000
#define	I2CCMD_OPCODE_WRITE	0x00000000
#define	I2CCMD_RESET		0x10000000
#define	I2CCMD_READY		0x20000000
#define	I2CCMD_INTERRUPT_ENA	0x40000000
#define	I2CCMD_ERROR		0x80000000
#define	MAX_SGMII_PHY_REG_ADDR	255
#define	I2CCMD_PHY_TIMEOUT	200

#define	WMREG_EEWR	0x102c	/* EEPROM write */

#define	WMREG_PBA_ECC	0x01100	/* PBA ECC */
#define	PBA_ECC_COUNTER_MASK	0xfff00000 /* ECC counter mask */
#define	PBA_ECC_COUNTER_SHIFT	20	   /* ECC counter shift value */
#define	PBA_ECC_CORR_EN		0x00000001 /* Enable ECC error correction */
#define	PBA_ECC_STAT_CLR	0x00000002 /* Clear ECC error counter */
#define	PBA_ECC_INT_EN		0x00000004 /* Enable ICR bit 5 on ECC error */

#define	WMREG_GPIE	0x01514 /* General Purpose Interrupt Enable */
#define	GPIE_NSICR	__BIT(0)	/* Non Selective Interrupt Clear */
#define	GPIE_MULTI_MSIX	__BIT(4)	/* Multiple MSIX */
#define	GPIE_EIAME	__BIT(30)	/* Extended Interrupt Auto Mask Ena. */
#define	GPIE_PBA	__BIT(31)	/* PBA support */

#define	WMREG_EICS	0x01520  /* Ext. Interrupt Cause Set - WO */
#define	WMREG_EIMS	0x01524  /* Ext. Interrupt Mask Set/Read - RW */
#define	WMREG_EIMC	0x01528  /* Ext. Interrupt Mask Clear - WO */
#define	WMREG_EIAC	0x0152c  /* Ext. Interrupt Auto Clear - RW */
#define	WMREG_EIAM	0x01530  /* Ext. Interrupt Ack Auto Clear Mask - RW */

#define	WMREG_EICR	0x01580  /* Ext. Interrupt Cause Read - R/clr */

#define	WMREG_MSIXBM(x)	(0x1600 + (x) * 4) /* MSI-X Allocation */

#define	EITR_RX_QUEUE(x)	__BIT(0+(x)) /* Rx Queue x Interrupt x=[0-3] */
#define	EITR_TX_QUEUE(x)	__BIT(8+(x)) /* Tx Queue x Interrupt x=[0-3] */
#define	EITR_TCP_TIMER	0x40000000 /* TCP Timer */
#define	EITR_OTHER	0x80000000 /* Interrupt Cause Active */

#define	WMREG_EITR(x)	(0x01680 + (0x4 * (x)))
#define	EITR_ITR_INT_MASK	__BITS(14,2)
#define	EITR_COUNTER_MASK_82575	__BITS(31,16)
#define	EITR_CNT_INGR		__BIT(31) /* does not overwrite counter */

#define	WMREG_EITR_82574(x)	(0x000e8 + (0x4 * (x)))
#define	EITR_ITR_INT_MASK_82574	__BITS(15, 0)

#define	WMREG_RXPBS	0x2404	/* Rx Packet Buffer Size  */
#define	RXPBS_SIZE_MASK_82576	0x0000007f

#define	WMREG_RDFH	0x2410	/* Receive Data FIFO Head */
#define	WMREG_RDFT	0x2418	/* Receive Data FIFO Tail */
#define	WMREG_RDFHS	0x2420	/* Receive Data FIFO Head Saved */
#define	WMREG_RDFTS	0x2428	/* Receive Data FIFO Tail Saved */
#define	WMREG_RADV	0x282c	/* Receive Interrupt Absolute Delay Timer */

#define	WMREG_TXDMAC	0x3000	/* Transfer DMA Control */
#define	TXDMAC_DPP	__BIT(0)	/* disable packet prefetch */

#define	WMREG_KABGTXD	0x3004	/* AFE and Gap Transmit Ref Data */
#define	KABGTXD_BGSQLBIAS 0x00050000

#define	WMREG_TDFH	0x3410	/* Transmit Data FIFO Head */
#define	WMREG_TDFT	0x3418	/* Transmit Data FIFO Tail */
#define	WMREG_TDFHS	0x3420	/* Transmit Data FIFO Head Saved */
#define	WMREG_TDFTS	0x3428	/* Transmit Data FIFO Tail Saved */
#define	WMREG_TDFPC	0x3430	/* Transmit Data FIFO Packet Count */

#define	WMREG_TXDCTL(n)		/* Trandmit Descriptor Control */ \
	(((n) < 4) ? (0x3828 + ((n) * 0x100)) : (0xe028 + ((n) * 0x40)))
#define	TXDCTL_PTHRESH(x) ((x) << 0)	/* prefetch threshold */
#define	TXDCTL_HTHRESH(x) ((x) << 8)	/* host threshold */
#define	TXDCTL_WTHRESH(x) ((x) << 16)	/* write back threshold */
/* flags used starting with 82575 ... */
#define	TXDCTL_COUNT_DESC	__BIT(22) /* Enable the counting of desc.
					   still to be processed. */
#define	TXDCTL_QUEUE_ENABLE  0x02000000 /* Enable specific Tx Queue */
#define	TXDCTL_SWFLSH        0x04000000 /* Tx Desc. write-back flushing */
#define	TXDCTL_PRIORITY      0x08000000

#define	WMREG_TADV	0x382c	/* Transmit Absolute Interrupt Delay Timer */
#define	WMREG_TSPMT	0x3830	/* TCP Segmentation Pad and Minimum
				   Threshold (Cordova) */
#define	TSPMT_TSMT(x)	(x)		/* TCP seg min transfer */
#define	TSPMT_TSPBP(x)	((x) << 16)	/* TCP seg pkt buf padding */

#define	WMREG_TARC0	0x3840	/* Tx arbitration count (0) */
#define	WMREG_TARC1	0x3940	/* Tx arbitration count (1) */

#define	WMREG_CRCERRS	0x4000	/* CRC Error Count */
#define	WMREG_ALGNERRC	0x4004	/* Alignment Error Count */
#define	WMREG_SYMERRC	0x4008	/* Symbol Error Count */
#define	WMREG_RXERRC	0x400c	/* Receive error Count - R/clr */
#define	WMREG_MPC	0x4010	/* Missed Packets Count - R/clr */
#define	WMREG_SCC	0x4014	/* Single Collision Count - R/clr */
#define	WMREG_ECOL	0x4018	/* Excessive Collisions Count - R/clr */
#define	WMREG_MCC	0x401c	/* Multiple Collision Count - R/clr */
#define	WMREG_LATECOL	0x4020	/* Late Collisions Count - R/clr */
#define	WMREG_COLC	0x4028	/* Collision Count - R/clr */
#define	WMREG_CBTMPC	0x402c	/* Circuit Breaker Tx Manageability Packet */
#define	WMREG_DC	0x4030	/* Defer Count - R/clr */
#define	WMREG_TNCRS	0x4034	/* Tx with No CRS - R/clr */
#define	WMREG_SEC	0x4038	/* Sequence Error Count */

/* Old */
#define	WMREG_CEXTERR	0x403c	/* Carrier Extension Error Count */
/* New */
#define	WMREG_HTDPMC	0x403c	/* Host Tx Discarded Packets by MAC Count */

#define	WMREG_RLEC	0x4040	/* Receive Length Error Count */
#define	WMREG_CBRDPC	0x4044	/* Circuit Breaker Rx Dropped Packet Count */
#define	WMREG_XONRXC	0x4048	/* XON Rx Count - R/clr */
#define	WMREG_XONTXC	0x404c	/* XON Tx Count - R/clr */
#define	WMREG_XOFFRXC	0x4050	/* XOFF Rx Count - R/clr */
#define	WMREG_XOFFTXC	0x4054	/* XOFF Tx Count - R/clr */
#define	WMREG_FCRUC	0x4058	/* Flow Control Rx Unsupported Count - R/clr */
#define	WMREG_PRC64	0x405c	/* Packets Rx (64 bytes) - R/clr */
#define	WMREG_PRC127	0x4060	/* Packets Rx (65-127 bytes) - R/clr */
#define	WMREG_PRC255	0x4064	/* Packets Rx (128-255 bytes) - R/clr */
#define	WMREG_PRC511	0x4068	/* Packets Rx (255-511 bytes) - R/clr */
#define	WMREG_PRC1023	0x406c	/* Packets Rx (512-1023 bytes) - R/clr */
#define	WMREG_PRC1522	0x4070	/* Packets Rx (1024-1522 bytes) - R/clr */
#define	WMREG_GPRC	0x4074	/* Good Packets Rx Count - R/clr */
#define	WMREG_BPRC	0x4078	/* Broadcast Packets Rx Count - R/clr */
#define	WMREG_MPRC	0x407c	/* Multicast Packets Rx Count - R/clr */
#define	WMREG_GPTC	0x4080	/* Good Packets Tx Count - R/clr */
#define	WMREG_GORCL	0x4088	/* Good Octets Rx Count Low - R/clr */
#define	WMREG_GORCH	0x408c	/* Good Octets Rx Count High - R/clr */
#define	WMREG_GOTCL	0x4090	/* Good Octets Tx Count Low - R/clr */
#define	WMREG_GOTCH	0x4094	/* Good Octets Tx Count High - R/clr */
#define	WMREG_RNBC	0x40a0	/* Receive No Buffers Count */
#define	WMREG_RUC	0x40a4	/* Rx Undersize Count - R/clr */
#define	WMREG_RFC	0x40a8	/* Rx Fragment Count - R/clr */
#define	WMREG_ROC	0x40ac	/* Rx Oversize Count - R/clr */
#define	WMREG_RJC	0x40b0	/* Rx Jabber Count - R/clr */
#define	WMREG_MGTPRC	0x40b4	/* Management Packets RX Count - R/clr */
#define	WMREG_MGTPDC	0x40b8	/* Management Packets Dropped Count - R/clr */
#define	WMREG_MGTPTC	0x40bc	/* Management Packets TX Count - R/clr */
#define	WMREG_TORL	0x40c0	/* Total Octets Rx Low - R/clr */
#define	WMREG_TORH	0x40c4	/* Total Octets Rx High - R/clr */
#define	WMREG_TOTL	0x40c8	/* Total Octets Tx Low - R/clr */
#define	WMREG_TOTH	0x40cc	/* Total Octets Tx High - R/clr */
#define	WMREG_TPR	0x40d0	/* Total Packets Rx - R/clr */
#define	WMREG_TPT	0x40d4	/* Total Packets Tx - R/clr */
#define	WMREG_PTC64	0x40d8	/* Packets Tx (64 bytes) - R/clr */
#define	WMREG_PTC127	0x40dc	/* Packets Tx (65-127 bytes) - R/clr */
#define	WMREG_PTC255	0x40e0	/* Packets Tx (128-255 bytes) - R/clr */
#define	WMREG_PTC511	0x40e4	/* Packets Tx (256-511 bytes) - R/clr */
#define	WMREG_PTC1023	0x40e8	/* Packets Tx (512-1023 bytes) - R/clr */
#define	WMREG_PTC1522	0x40ec	/* Packets Tx (1024-1522 Bytes) - R/clr */
#define	WMREG_MPTC	0x40f0	/* Multicast Packets Tx Count - R/clr */
#define	WMREG_BPTC	0x40f4	/* Broadcast Packets Tx Count */
#define	WMREG_TSCTC	0x40f8	/* TCP Segmentation Context Tx */

/* Old */
#define	WMREG_TSCTFC	0x40fc	/* TCP Segmentation Context Tx Fail */
/* New */
#define	WMREG_CBRMPC	0x40fc	/* Circuit Breaker Rx Manageability Packet */

#define	WMREG_IAC	0x4100	/* Interrupt Assertion Count */

/* Old */
#define	WMREG_ICRXPTC	0x4104	/* Interrupt Cause Rx Pkt Timer Expire Count */
#define	WMREG_ICRXATC	0x4108	/* Interrupt Cause Rx Abs Timer Expire Count */
#define	WMREG_ICTXPTC	0x410c	/* Interrupt Cause Tx Pkt Timer Expire Count */
#define	WMREG_ICTXATC	0x4110	/* Interrupt Cause Tx Abs Timer Expire Count */
#define	WMREG_ICTXQEC	0x4118	/* Interrupt Cause Tx Queue Empty Count */
#define	WMREG_ICTXQMTC	0x411c	/* Interrupt Cause Tx Queue Min Thresh Count */
#define	WMREG_ICRXDMTC	0x4120	/* Interrupt Cause Rx Desc Min Thresh Count */
#define	WMREG_ICRXOC	0x4124	/* Interrupt Cause Receiver Overrun Count */
/* New */
#define	WMREG_RPTHC	0x4104	/* Rx Pkt To Host Count */
#define	WMREG_DEBUG1	0x4108	/* Debug Counter 1 */
#define	WMREG_DEBUG2	0x410c	/* Debug Counter 2 */
#define	WMREG_DEBUG3	0x4110	/* Debug Counter 3 */
#define	WMREG_HGPTC	0x4118	/* Host Good Packets Tx Count (>=82576?) */
#define	WMREG_DEBUG4	0x411c	/* Debug Counter 4 */
#define	WMREG_RXDMTC	0x4120	/* Rx Desc Min Thresh Count */
#define	WMREG_HTCBDPC	0x4124	/* Host Tx Circuit Breaker Dropped Pkt. Cnt. */
#define	WMREG_HGORCL	0x4128	/* Host Good Octets Rx Count Low (>=82576?) */
#define	WMREG_HGORCH	0x412c	/* Host Good Octets Rx Count High (>=82576?) */
#define	WMREG_HGOTCL	0x4130	/* Host Good Octets Tx Count Low (>=82576?) */
#define	WMREG_HGOTCH	0x4134	/* Host Good Octets Tx Count High (>=82576?) */
#define	WMREG_LENERRS	0x4138	/* Length Errors Count (>=82576?) */

#define	WMREG_TLPIC	0x4148	/* EEE Tx LPI Count */
#define	WMREG_RLPIC	0x414c	/* EEE Rx LPI Count */
#define	WMREG_B2OGPRC	0x4158	/* BMC2OS packets received by host */
#define	WMREG_O2BSPC	0x415c	/* OS2BMC packets transmitted by host */

#define	WMREG_PCS_CFG	0x4200	/* PCS Configuration */
#define	PCS_CFG_PCS_EN	__BIT(3)

#define	WMREG_PCS_LCTL	0x4208	/* PCS Link Control */
#define	PCS_LCTL_FLV_LINK_UP	__BIT(0)	/* Forced Link Value */
#define	PCS_LCTL_FSV_MASK	__BITS(2, 1)	/* Forced Speed Value */
#define	PCS_LCTL_FSV_10			0		/* 10Mbps */
#define	PCS_LCTL_FSV_100		__BIT(1)	/* 100Mbps */
#define	PCS_LCTL_FSV_1000		__BIT(2)	/* 1Gpbs */
#define	PCS_LCTL_FDV_FULL	__BIT(3)	/* Force Duplex Value */
#define	PCS_LCTL_FSD		__BIT(4)	/* Force Speed and Duplex */
#define	PCS_LCTL_FORCE_LINK	__BIT(5)	/* Force Link */
#define	PCS_LCTL_LINK_LATCH_LOW	__BIT(6)	/* Link Latch Low */
#define	PCS_LCTL_FORCE_FC	__BIT(7)	/* Force Flow Control */
#define	PCS_LCTL_AN_ENABLE	__BIT(16)	/* AN enable */
#define	PCS_LCTL_AN_RESTART	__BIT(17)	/* AN restart */
#define	PCS_LCTL_AN_TIMEOUT	__BIT(18)	/* AN Timeout Enable */
#define	PCS_LCTL_AN_SGMII_BYP	__BIT(19)	/* AN SGMII Bypass */
#define	PCS_LCTL_AN_SGMII_TRIG	__BIT(20)	/* AN SGMII Trigger */
#define	PCS_LCTL_FAST_LINKTIMER	__BIT(24)	/* Fast Link Timer */
#define	PCS_LCTL_LINK_OK_FIX_EN	__BIT(25)	/* Link OK Fix Enable */

#define	WMREG_PCS_LSTS	0x420c	/* PCS Link Status */
#define	PCS_LSTS_LINKOK	__BIT(0)
#define	PCS_LSTS_SPEED	__BITS(2, 1)
#define	PCS_LSTS_SPEED_10	0
#define	PCS_LSTS_SPEED_100	1
#define	PCS_LSTS_SPEED_1000	2
#define	PCS_LSTS_FDX	__BIT(3)
#define	PCS_LSTS_AN_COMP __BIT(16)

#define	WMREG_PCS_ANADV	0x4218	/* AN Advertsement */
#define	WMREG_PCS_LPAB	0x421c	/* Link Partnet Ability */
#define	WMREG_PCS_NPTX	0x4220	/* Next Page Transmit */
#define	WMREG_SCVPC	0x4228	/* SerDes/SGMII Code Violation Packet Count */

#define	WMREG_RXCSUM	0x5000	/* Receive Checksum register */
#define	RXCSUM_PCSS	0x000000ff	/* Packet Checksum Start */
#define	RXCSUM_IPOFL	__BIT(8)	/* IP checksum offload */
#define	RXCSUM_TUOFL	__BIT(9)	/* TCP/UDP checksum offload */
#define	RXCSUM_IPV6OFL	__BIT(10)	/* IPv6 checksum offload */
#define	RXCSUM_CRCOFL	__BIT(11)	/* SCTP CRC32 checksum offload */
#define	RXCSUM_IPPCSE	__BIT(12)	/* IP payload checksum enable */
#define	RXCSUM_PCSD	__BIT(13)	/* packet checksum disabled */

#define	WMREG_RLPML	0x5004	/* Rx Long Packet Max Length */

#define	WMREG_RFCTL	0x5008	/* Receive Filter Control */
#define	WMREG_RFCTL_NFSWDIS	__BIT(6)  /* NFS Write Disable */
#define	WMREG_RFCTL_NFSRDIS	__BIT(7)  /* NFS Read Disable */
#define	WMREG_RFCTL_ACKDIS	__BIT(12) /* ACK Accelerate Disable */
#define	WMREG_RFCTL_ACKD_DIS	__BIT(13) /* ACK data Disable */
#define	WMREG_RFCTL_EXSTEN	__BIT(15) /* Extended status Enable. 82574 only. */
#define	WMREG_RFCTL_IPV6EXDIS	__BIT(16) /* IPv6 Extension Header Disable */
#define	WMREG_RFCTL_NEWIPV6EXDIS __BIT(17) /* New IPv6 Extension Header */

#define	WMREG_WUC	0x5800	/* Wakeup Control */
#define	WUC_APME		0x00000001 /* APM Enable */
#define	WUC_PME_EN		0x00000002 /* PME Enable */
#define	WUC_PME_STATUS		0x00000004 /* PME Status */
#define	WUC_APMPME		0x00000008 /* Assert PME on APM Wakeup */
#define	WUC_PHY_WAKE		0x00000100 /* if PHY supports wakeup */

#define	WMREG_WUFC	0x5808	/* Wakeup Filter Control */
#define	WUFC_LNKC	__BIT(0)	/* Link Status Change Wakeup Enable */
#define	WUFC_MAG	__BIT(1)	/* Magic Packet Wakeup Enable */
#define	WUFC_EX		__BIT(2)	/* Directed Exact Wakeup Enable */
#define	WUFC_MC		__BIT(3)	/* Directed Multicast Wakeup En */
#define	WUFC_BC		__BIT(4)	/* Broadcast Wakeup Enable */
#define	WUFC_ARPDIR	__BIT(5)	/* ARP Request Packet Wakeup En */
#define	WUFC_IPV4	__BIT(6)	/* Directed IPv4 Packet Wakeup En */
#define	WUFC_IPV6	__BIT(7)	/* Directed IPv6 Packet Wakeup En */
#define	WUFC_NS		__BIT(9)	/* NS Wakeup En */
#define	WUFC_NSDIR	__BIT(10)	/* NS Directed En */
#define	WUFC_ARP	__BIT(11)	/* ARP request En */
#define	WUFC_FLEX_HQ	__BIT(14)	/* Flex Filters Host Queueing En */
#define	WUFC_NOTCO	__BIT(15)	/* ? */
#define	WUFC_FLX	__BITS(23, 16)	/* Flexible Filter [0-7] En */
#define	WUFC_FLXACT	__BITS(27, 24)	/* Flexible Filter [0-3] Action */
#define	WUFC_FW_RST_WK	__BIT(31)	/* Wake on Firmware Reset Assert En */

#define	WMREG_WUS	0x5810	/* Wakeup Status (R/W1C) */
	/* Bit 30-24 and 15-12 are reserved */
#define	WUS_MNG		__BIT(8)	/* Manageability event */
#define	WUS_FLAGS	"\20"						\
	"\1LINKC"	"\2MAG"		"\3EX"		"\4MC"		\
	"\5BC"		"\6ARPDIR"	"\7IPV4"	"\10IPV6"	\
	"\11MNG"	"\12NS"		"\13NSDIR"	"\14ARP"	\
	"\21FLX0"	"\22FLX1"	"\23FLX2"	"\24FLX3"	\
	"\25FLX4"	"\26FLX5"	"\27FLX6"	"\30FLX7"	\
							"\40FW_RST_WK"

#define	WMREG_MRQC	0x5818	/* Multiple Receive Queues Command */
#define	MRQC_DISABLE_RSS	0x00000000
#define	MRQC_ENABLE_RSS_MQ_82574	__BIT(0) /* enable RSS for 82574 */
#define	MRQC_ENABLE_RSS_MQ	__BIT(1) /* enable hardware max RSS without VMDq */
#define	MRQC_ENABLE_RSS_VMDQ	__BITS(1, 0) /* enable RSS with VMDq */
#define	MRQC_DEFQ_MASK		__BITS(5, 3)
				/*
				 * Defines the default queue in non VMDq
				 * mode according to value of the Multiple Receive
				 * Queues Enable field.
				 */
#define	MRQC_DEFQ_NOT_RSS_FLT	__SHFTIN(__BIT(1), MRQC_DEFQ_MASK)
				/*
				 * the destination of all packets
				 * not forwarded by RSS or filters
				 */
#define	MRQC_DEFQ_NOT_MAC_ETH	__SHFTIN(__BITS(1, 0), MRQC_DEFQ_MASK)
				/*
				 * Def_Q field is ignored. Queueing
				 * decision of all packets not forwarded
				 * by MAC address and Ether-type filters
				 * is according to VT_CTL.DEF_PL field.
				 */
#define	MRQC_DEFQ_IGNORED1	__SHFTIN(__BIT(2), MRQC_DEFQ_MASK)
				/* Def_Q field is ignored */
#define	MRQC_DEFQ_IGNORED2	__SHFTIN(__BIT(2)|__BIT(0), MRQC_DEFQ_MASK)
				/* Def_Q field is ignored */
#define	MRQC_DEFQ_VMDQ		__SHFTIN(__BITS(2, 1), MRQC_DEFQ_MASK)
				/* for VMDq mode */
#define	MRQC_RSS_FIELD_IPV4_TCP		__BIT(16)
#define	MRQC_RSS_FIELD_IPV4		__BIT(17)
#define	MRQC_RSS_FIELD_IPV6_TCP_EX	__BIT(18)
#define	MRQC_RSS_FIELD_IPV6_EX		__BIT(19)
#define	MRQC_RSS_FIELD_IPV6		__BIT(20)
#define	MRQC_RSS_FIELD_IPV6_TCP		__BIT(21)
#define	MRQC_RSS_FIELD_IPV4_UDP		__BIT(22)
#define	MRQC_RSS_FIELD_IPV6_UDP		__BIT(23)
#define	MRQC_RSS_FIELD_IPV6_UDP_EX	__BIT(24)

#define	WMREG_RETA_Q(x)		(0x5c00 + ((x) >> 2) * 4) /* Redirection Table */
#define	RETA_NUM_ENTRIES	128
#define	RETA_ENTRY_MASK_Q(x)	(0x000000ffUL << (((x) % 4) * 8)) /* Redirection Table */
#define	RETA_ENT_QINDEX_MASK		__BITS(3,0) /*queue index for 82580 and newer */
#define	RETA_ENT_QINDEX0_MASK_82575	__BITS(3,2) /*queue index for pool0 */
#define	RETA_ENT_QINDEX1_MASK_82575	__BITS(7,6) /*queue index for pool1 and regular RSS */
#define	RETA_ENT_QINDEX_MASK_82574	__BIT(7) /*queue index for 82574 */

#define	WMREG_RSSRK(x)		(0x5c80 + (x) * 4) /* RSS Random Key Register */
#define	RSSRK_NUM_REGS		10

#define	WMREG_MANC	0x5820	/* Management Control */
#define	MANC_SMBUS_EN		__BIT(0)
#define	MANC_ASF_EN		__BIT(1)
#define	MANC_ARP_EN		__BIT(13)
#define	MANC_RECV_TCO_RESET	__BIT(16)
#define	MANC_RECV_TCO_EN	__BIT(17)
#define	MANC_BLK_PHY_RST_ON_IDE	__BIT(18)
#define	MANC_RECV_ALL		__BIT(19)
#define	MANC_EN_MAC_ADDR_FILTER	__BIT(20)
#define	MANC_EN_MNG2HOST	__BIT(21)
#define	MANC_EN_BMC2OS		__BIT(28)

#define	WMREG_MANC2H	0x5860	/* Management Control To Host - RW */
#define	MANC2H_PORT_623		(1 << 5)
#define	MANC2H_PORT_624		(1 << 6)

#define	WMREG_GCR	0x5b00	/* PCIe Control */
#define	GCR_RXD_NO_SNOOP	0x00000001
#define	GCR_RXDSCW_NO_SNOOP	0x00000002
#define	GCR_RXDSCR_NO_SNOOP	0x00000004
#define	GCR_TXD_NO_SNOOP	0x00000008
#define	GCR_TXDSCW_NO_SNOOP	0x00000010
#define	GCR_TXDSCR_NO_SNOOP	0x00000020
#define	GCR_CMPL_TMOUT_MASK	0x0000f000
#define	GCR_CMPL_TMOUT_10MS	0x00001000
#define	GCR_CMPL_TMOUT_RESEND	0x00010000
#define	GCR_CAP_VER2		0x00040000
#define	GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000
#define	GCR_NO_SNOOP_ALL (GCR_RXD_NO_SNOOP | \
	    GCR_RXDSCW_NO_SNOOP |	     \
	    GCR_RXDSCR_NO_SNOOP |	     \
	    GCR_TXD_NO_SNOOP |		     \
	    GCR_TXDSCW_NO_SNOOP |	     \
	    GCR_TXDSCR_NO_SNOOP)

#define	WMREG_FACTPS	0x5b30	/* Function Active and Power State to MNG */
#define	FACTPS_MNGCG		0x20000000
#define	FACTPS_LFS		0x40000000	/* LAN Function Select */

#define	WMREG_GIOCTL	0x5b44	/* GIO Analog Control Register */
#define	WMREG_CCMCTL	0x5b48	/* CCM Control Register */
#define	WMREG_SCCTL	0x5b4c	/* PCIc PLL Configuration Register */

#define	WMREG_SWSM	0x5b50	/* SW Semaphore */
#define	SWSM_SMBI	0x00000001	/* Driver Semaphore bit */
#define	SWSM_SWESMBI	0x00000002	/* FW Semaphore bit */
#define	SWSM_WMNG	0x00000004	/* Wake MNG Clock */
#define	SWSM_DRV_LOAD	0x00000008	/* Driver Loaded Bit */
/* Intel driver defines H2ME register at 0x5b50 */
#define	WMREG_H2ME	0x5b50	/* SW Semaphore */
#define	H2ME_ULP		__BIT(11)
#define	H2ME_ENFORCE_SETTINGS	__BIT(12)

#define	WMREG_FWSM	0x5b54	/* FW Semaphore */
#define	FWSM_MODE		__BITS(1, 3)
#define	MNG_ICH_IAMT_MODE	0x2	/* PT mode? */
#define	MNG_IAMT_MODE		0x3
#define	FWSM_RSPCIPHY		__BIT(6)  /* Reset PHY on PCI reset */
#define	FWSM_WLOCK_MAC		__BITS(7, 9)
#define	FWSM_ULP_CFG_DONE	__BIT(10)
#define	FWSM_FW_VALID		__BIT(15) /* FW established a valid mode */

#define	WMREG_SWSM2	0x5b58	/* SW Semaphore 2 */
#define	SWSM2_LOCK		0x00000002 /* Secondary driver semaphore bit */

#define	WMREG_SW_FW_SYNC 0x5b5c	/* software-firmware semaphore */
#define	SWFW_EEP_SM		0x0001 /* eeprom access */
#define	SWFW_PHY0_SM		0x0002 /* first ctrl phy access */
#define	SWFW_PHY1_SM		0x0004 /* second ctrl phy access */
#define	SWFW_MAC_CSR_SM		0x0008
#define	SWFW_PHY2_SM		0x0020 /* first ctrl phy access */
#define	SWFW_PHY3_SM		0x0040 /* first ctrl phy access */
#define	SWFW_SOFT_SHIFT		0	/* software semaphores */
#define	SWFW_FIRM_SHIFT		16	/* firmware semaphores */

#define	WMREG_GCR2	0x5b64	/* 3GPIO Control Register 2 */
#define	WMREG_FEXTNVM9	0x5bb4	/* Future Extended NVM 9 */
#define	FEXTNVM9_IOSFSB_CLKGATE_DIS __BIT(11)
#define	FEXTNVM9_IOSFSB_CLKREQ_DIS __BIT(12)
#define	WMREG_FEXTNVM11	0x5bbc	/* Future Extended NVM 11 */
#define	FEXTNVM11_DIS_MULRFIX	__BIT(13)	/* Disable MULR fix */

#define	WMREG_FFLT_DBG	0x05F04 /* Debug Register */

#define	WMREG_CRC_OFFSET 0x5f50
#define	WMREG_PCH_RAICC(x)	(WMREG_CRC_OFFSET + (x) * 4)

#define	WMREG_B2OSPC	0x8fe0	/* BMC2OS packets sent by BMC */
#define	WMREG_O2BGPTC	0x8fe4	/* OS2BMC packets received by BMC */

#define	WMREG_HRMPC	0xa018	/* Header Redirection Missed Packet Count */

#define	WMREG_EEC	0x12010
#define	EEC_FLASH_DETECTED __BIT(19)	/* FLASH */
#define	EEC_FLUPD	__BIT(23)	/* Update FLASH */

#define	WMREG_EEARBC_I210 0x12024

/*
 * NVM related values.
 *  Microwire, SPI, and flash
 */
#define	UWIRE_OPC_ERASE	0x04		/* MicroWire "erase" opcode */
#define	UWIRE_OPC_WRITE	0x05		/* MicroWire "write" opcode */
#define	UWIRE_OPC_READ	0x06		/* MicroWire "read" opcode */

#define	SPI_OPC_WRITE	0x02		/* SPI "write" opcode */
#define	SPI_OPC_READ	0x03		/* SPI "read" opcode */
#define	SPI_OPC_A8	0x08		/* opcode bit 3 == address bit 8 */
#define	SPI_OPC_WREN	0x06		/* SPI "set write enable" opcode */
#define	SPI_OPC_WRDI	0x04		/* SPI "clear write enable" opcode */
#define	SPI_OPC_RDSR	0x05		/* SPI "read status" opcode */
#define	SPI_OPC_WRSR	0x01		/* SPI "write status" opcode */
#define	SPI_MAX_RETRIES	5000		/* max wait of 5ms for RDY signal */

#define	SPI_SR_RDY	0x01
#define	SPI_SR_WEN	0x02
#define	SPI_SR_BP0	0x04
#define	SPI_SR_BP1	0x08
#define	SPI_SR_WPEN	0x80

#define	NVM_CHECKSUM		0xBABA
#define	NVM_SIZE		0x0040
#define	NVM_WORD_SIZE_BASE_SHIFT 6

#define	NVM_OFF_MACADDR		0x0000	/* MAC address offset 0 */
#define	NVM_OFF_MACADDR1	0x0001	/* MAC address offset 1 */
#define	NVM_OFF_MACADDR2	0x0002	/* MAC address offset 2 */
#define	NVM_OFF_COMPAT		0x0003
#define	NVM_OFF_ID_LED_SETTINGS	0x0004
#define	NVM_OFF_VERSION		0x0005
#define	NVM_OFF_CFG1		0x000a	/* config word 1 */
#define	NVM_OFF_CFG2		0x000f	/* config word 2 */
#define	NVM_OFF_EEPROM_SIZE	0x0012	/* NVM SIZE */
#define	NVM_OFF_CFG4		0x0013	/* config word 4 */
#define	NVM_OFF_CFG3_PORTB	0x0014	/* config word 3 */
#define	NVM_OFF_FUTURE_INIT_WORD1 0x0019
#define	NVM_OFF_INIT_3GIO_3	0x001a	/* PCIe Initial Configuration Word 3 */
#define	NVM_OFF_K1_CONFIG	0x001b	/* NVM K1 Config */
#define	NVM_OFF_LED_1_CFG	0x001c
#define	NVM_OFF_LED_0_2_CFG	0x001f
#define	NVM_OFF_SWDPIN		0x0020	/* SWD Pins (Cordova) */
#define	NVM_OFF_CFG3_PORTA	0x0024	/* config word 3 */
#define	NVM_OFF_ALT_MAC_ADDR_PTR 0x0037	/* to the alternative MAC addresses */
#define	NVM_OFF_COMB_VER_PTR	0x003d
#define	NVM_OFF_IMAGE_UID0	0x0042
#define	NVM_OFF_IMAGE_UID1	0x0043

#define	NVM_COMPAT_VALID_CHECKSUM	0x0001

#define	NVM_CFG1_LVDID		__BIT(0)
#define	NVM_CFG1_LSSID		__BIT(1)
#define	NVM_CFG1_PME_CLOCK	__BIT(2)
#define	NVM_CFG1_PM		__BIT(3)
#define	NVM_CFG1_ILOS		__BIT(4)	/* Invert loss of signal */
#define	NVM_CFG1_SWDPIO_SHIFT	5
#define	NVM_CFG1_SWDPIO_MASK	(0xf << NVM_CFG1_SWDPIO_SHIFT)
#define	NVM_CFG1_IPS1		__BIT(8)
#define	NVM_CFG1_LRST		__BIT(9)
#define	NVM_CFG1_FD		__BIT(10)
#define	NVM_CFG1_FRCSPD		__BIT(11)
#define	NVM_CFG1_IPS0		__BIT(12)
#define	NVM_CFG1_64_32_BAR	__BIT(13)

#define	NVM_CFG2_CSR_RD_SPLIT	__BIT(1)
#define	NVM_CFG2_82544_APM_EN	__BIT(2)
#define	NVM_CFG2_64_BIT		__BIT(3)
#define	NVM_CFG2_MAX_READ	__BIT(4)
#define	NVM_CFG2_DMCR_MAP	__BIT(5)
#define	NVM_CFG2_133_CAP	__BIT(6)
#define	NVM_CFG2_MSI_DIS	__BIT(7)
#define	NVM_CFG2_FLASH_DIS	__BIT(8)
#define	NVM_CFG2_FLASH_SIZE(x)	(((x) & 3) >> 9)
#define	NVM_CFG2_APM_EN		__BIT(10)
#define	NVM_CFG2_ANE		__BIT(11)
#define	NVM_CFG2_PAUSE(x)	(((x) & 3) >> 12)
#define	NVM_CFG2_ASDE		__BIT(14)
#define	NVM_CFG2_APM_PME	__BIT(15)
#define	NVM_CFG2_SWDPIO_SHIFT	4
#define	NVM_CFG2_SWDPIO_MASK	(0xf << NVM_CFG2_SWDPIO_SHIFT)
#define	NVM_CFG2_MNGM_SHIFT	13	/* Manageability Operation mode */
#define	NVM_CFG2_MNGM_MASK	(3U << NVM_CFG2_MNGM_SHIFT)
#define	NVM_CFG2_MNGM_DIS	0
#define	NVM_CFG2_MNGM_NCSI	1
#define	NVM_CFG2_MNGM_PT	2

#define	NVM_COMPAT_MAS_EN(x)		__BIT(x) /* Media Auto Sense Enable */
#define	NVM_COMPAT_SERDES_FORCE_MODE	__BIT(14) /* Don't use autonego */

#define	NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM	0x0040

#define	NVM_K1_CONFIG_ENABLE	0x01

#define	NVM_SWDPIN_MASK		0xdf
#define	NVM_SWDPIN_SWDPIN_SHIFT 0
#define	NVM_SWDPIN_SWDPIO_SHIFT 8

#define	NVM_3GIO_3_ASPM_MASK	(0x3 << 2)	/* Active State PM Support */

#define	NVM_CFG3_PORTA_EXT_MDIO	__BIT(2)	/* External MDIO Interface */
#define	NVM_CFG3_PORTA_COM_MDIO	__BIT(3)	/* MDIO Interface is shared */
#define	NVM_CFG3_APME		__BIT(10)	/* APM Enable */
#define	NVM_CFG3_ILOS		__BIT(13)	/* Invert loss of signal */

#define	NVM_OFF_MACADDR_82571(x)	(3 * (x))

/*
 * EEPROM Partitioning. See Table 6-1, "EEPROM Top Level Partitioning"
 * in 82580's datasheet.
 */
#define	NVM_OFF_LAN_FUNC_82580(x)	((x) ? (0x40 + (0x40 * (x))) : 0)

#define	NVM_COMBO_VER_OFF	0x0083

#define	NVM_MAJOR_MASK		0xf000
#define	NVM_MAJOR_SHIFT		12
#define	NVM_MINOR_MASK		0x0ff0
#define	NVM_MINOR_SHIFT		4
#define	NVM_BUILD_MASK		0x000f
#define	NVM_UID_VALID		0x8000

/* iNVM Registers for i21[01] */
#define	WM_INVM_DATA_REG(reg)	(0x12120 + 4*(reg))
#define	INVM_SIZE			64 /* Number of INVM Data Registers */

/* iNVM default value */
#define	NVM_INIT_CTRL_2_DEFAULT_I211	0x7243
#define	NVM_INIT_CTRL_4_DEFAULT_I211	0x00c1
#define	NVM_LED_1_CFG_DEFAULT_I211	0x0184
#define	NVM_LED_0_2_CFG_DEFAULT_I211	0x200c
#define	NVM_RESERVED_WORD		0xffff

#define	INVM_DWORD_TO_RECORD_TYPE(dword)	((dword) & 0x7)
#define	INVM_DWORD_TO_WORD_ADDRESS(dword)	(((dword) & 0x0000FE00) >> 9)
#define	INVM_DWORD_TO_WORD_DATA(dword)		(((dword) & 0xFFFF0000) >> 16)

#define	INVM_UNINITIALIZED_STRUCTURE		0x0
#define	INVM_WORD_AUTOLOAD_STRUCTURE		0x1
#define	INVM_CSR_AUTOLOAD_STRUCTURE		0x2
#define	INVM_PHY_REGISTER_AUTOLOAD_STRUCTURE	0x3
#define	INVM_RSA_KEY_SHA256_STRUCTURE		0x4
#define	INVM_INVALIDATED_STRUCTURE		0xf

#define	INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS	8
#define	INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS	1

#define	INVM_DEFAULT_AL		0x202f
#define	INVM_AUTOLOAD		0x0a
#define	INVM_PLL_WO_VAL		0x0010

/* Version and Image Type field */
#define	INVM_VER_1	__BITS(12,3)
#define	INVM_VER_2	__BITS(22,13)
#define	INVM_IMGTYPE	__BITS(28,23)
#define	INVM_MINOR	__BITS(3,0)
#define	INVM_MAJOR	__BITS(9,4)

/* Word definitions for ID LED Settings */
#define	ID_LED_RESERVED_FFFF 0xffff

/* ich8 flash control */
#define	ICH_FLASH_COMMAND_TIMEOUT            5000    /* 5000 uSecs - adjusted */
#define	ICH_FLASH_ERASE_TIMEOUT              3000000 /* Up to 3 seconds - worst case */
#define	ICH_FLASH_CYCLE_REPEAT_COUNT         10      /* 10 cycles */
#define	ICH_FLASH_SEG_SIZE_256               256
#define	ICH_FLASH_SEG_SIZE_4K                4096
#define	ICH_FLASH_SEG_SIZE_64K               65536

#define	ICH_CYCLE_READ                       0x0
#define	ICH_CYCLE_RESERVED                   0x1
#define	ICH_CYCLE_WRITE                      0x2
#define	ICH_CYCLE_ERASE                      0x3

#define	ICH_FLASH_GFPREG   0x0000
#define	ICH_FLASH_HSFSTS   0x0004 /* Flash Status Register */
#define	HSFSTS_DONE		0x0001 /* Flash Cycle Done */
#define	HSFSTS_ERR		0x0002 /* Flash Cycle Error */
#define	HSFSTS_DAEL		0x0004 /* Direct Access error Log */
#define	HSFSTS_ERSZ_MASK	0x0018 /* Block/Sector Erase Size */
#define	HSFSTS_ERSZ_SHIFT	3
#define	HSFSTS_FLINPRO		0x0020 /* flash SPI cycle in Progress */
#define	HSFSTS_FLDVAL		0x4000 /* Flash Descriptor Valid */
#define	HSFSTS_FLLK		0x8000 /* Flash Configuration Lock-Down */
#define	ICH_FLASH_HSFCTL   0x0006 /* Flash control Register */
#define	HSFCTL_GO		0x0001 /* Flash Cycle Go */
#define	HSFCTL_CYCLE_MASK	0x0006 /* Flash Cycle */
#define	HSFCTL_CYCLE_SHIFT	1
#define	HSFCTL_BCOUNT_MASK	0x0300 /* Data Byte Count */
#define	HSFCTL_BCOUNT_SHIFT	8
#define	ICH_FLASH_FADDR    0x0008
#define	ICH_FLASH_FDATA0   0x0010
#define	ICH_FLASH_FRACC    0x0050
#define	ICH_FLASH_FREG0    0x0054
#define	ICH_FLASH_FREG1    0x0058
#define	ICH_FLASH_FREG2    0x005c
#define	ICH_FLASH_FREG3    0x0060
#define	ICH_FLASH_FPR0     0x0074
#define	ICH_FLASH_FPR1     0x0078
#define	ICH_FLASH_SSFSTS   0x0090
#define	ICH_FLASH_SSFCTL   0x0092
#define	ICH_FLASH_PREOP    0x0094
#define	ICH_FLASH_OPTYPE   0x0096
#define	ICH_FLASH_OPMENU   0x0098

#define	ICH_FLASH_REG_MAPSIZE      0x00a0
#define	ICH_FLASH_SECTOR_SIZE      4096
#define	ICH_GFPREG_BASE_MASK       0x1fff
#define	ICH_FLASH_LINEAR_ADDR_MASK 0x00ffffff

#define	ICH_NVM_SIG_WORD	0x13
#define	ICH_NVM_SIG_MASK	0xc000
#define	ICH_NVM_VALID_SIG_MASK	0xc0
#define	ICH_NVM_SIG_VALUE	0x80

#define	NVM_SIZE_MULTIPLIER 4096	/* multiplier for NVMS field */
#define	WM_PCH_SPT_FLASHOFFSET	0xe000	/* offset of NVM access regs(PCH_SPT)*/

/* for PCI express Capability registers */
#define	WM_PCIE_DCSR2_16MS	0x00000005

/* SFF SFP ROM data */
#define	SFF_SFP_ID_OFF		0x00
#define	SFF_SFP_ID_UNKNOWN	0x00	/* Unknown */
#define	SFF_SFP_ID_SFF		0x02	/* Module soldered to motherboard */
#define	SFF_SFP_ID_SFP		0x03	/* SFP transceiver */

#define	SFF_SFP_ETH_FLAGS_OFF	0x06
#define	SFF_SFP_ETH_FLAGS_1000SX	0x01
#define	SFF_SFP_ETH_FLAGS_1000LX	0x02
#define	SFF_SFP_ETH_FLAGS_1000CX	0x04
#define	SFF_SFP_ETH_FLAGS_1000T		0x08
#define	SFF_SFP_ETH_FLAGS_100LX		0x10
#define	SFF_SFP_ETH_FLAGS_100FX		0x20

/* I21[01] PHY related definitions */
#define	GS40G_PAGE_SELECT	0x16
#define	GS40G_PAGE_SHIFT	16
#define	GS40G_OFFSET_MASK	0xffff
#define	GS40G_PHY_PLL_FREQ_PAGE	0xfc0000
#define	GS40G_PHY_PLL_FREQ_REG	0x000e
#define	GS40G_PHY_PLL_UNCONF	0xff

/* advanced TX descriptor for 82575 and newer */
typedef union nq_txdesc {
	struct {
		uint64_t nqtxd_addr;
		uint32_t nqtxd_cmdlen;
		uint32_t nqtxd_fields;
	} nqtx_data;
	struct {
		uint32_t nqtxc_vl_len;
		uint32_t nqtxc_sn;
		uint32_t nqtxc_cmd;
		uint32_t nqtxc_mssidx;
	} nqtx_ctx;
} __packed nq_txdesc_t;


/* Commands for nqtxd_cmdlen and nqtxc_cmd */
#define	NQTX_CMD_EOP	__BIT(24)	/* end of packet */
#define	NQTX_CMD_IFCS	__BIT(25)	/* insert FCS */
#define	NQTX_CMD_RS	__BIT(27)	/* report status */
#define	NQTX_CMD_DEXT	__BIT(29)	/* descriptor extension */
#define	NQTX_CMD_VLE	__BIT(30)	/* VLAN enable */
#define	NQTX_CMD_TSE	__BIT(31)	/* TCP segmentation enable */

/* Descriptor types (if DEXT is set) */
#define	NQTX_DTYP_C	(2U << 20)	/* context */
#define	NQTX_DTYP_D	(3U << 20)	/* data */

#define	NQTXD_FIELDS_IDX_SHIFT		4	/* context index shift */
#define	NQTXD_FIELDS_IDX_MASK		0xf
#define	NQTXD_FIELDS_PAYLEN_SHIFT	14	/* payload len shift */
#define	NQTXD_FIELDS_PAYLEN_MASK	0x3ffff

#define	NQTXD_FIELDS_IXSM		__BIT(8) /* do IP checksum */
#define	NQTXD_FIELDS_TUXSM		__BIT(9) /* do TCP/UDP checksum */

#define	NQTXC_VLLEN_IPLEN_SHIFT		0	/* IP header len */
#define	NQTXC_VLLEN_IPLEN_MASK		0x1ff
#define	NQTXC_VLLEN_MACLEN_SHIFT	9	/* MAC header len */
#define	NQTXC_VLLEN_MACLEN_MASK		0x7f
#define	NQTXC_VLLEN_VLAN_SHIFT		16	/* vlan number */
#define	NQTXC_VLLEN_VLAN_MASK		0xffff

#define	NQTXC_CMD_MKRLOC_SHIFT		0	/* IP checksum offset */
#define	NQTXC_CMD_MKRLOC_MASK		0x1ff
#define	NQTXC_CMD_SNAP			__BIT(9)
#define	NQTXC_CMD_IPV_MASK		__BIT(10)
#define	NQTXC_CMD_IP4			__SHIFTIN(1, NQTXC_CMD_IPV_MASK)
#define	NQTXC_CMD_IP6			__SHIFTIN(0, NQTXC_CMD_IPV_MASK)
#define	NQTXC_CMD_TP_MASK		__BIT(11)
#define	NQTXC_CMD_TCP			__SHIFTIN(1, NQTXC_CMD_TP_MASK)
#define	NQTXC_CMD_UDP			__SHIFTIN(0, NQTXC_CMD_TP_MASK)
#define	NQTXC_MSSIDX_IDX_SHIFT		4	/* context index shift */
#define	NQTXC_MSSIDX_IDX_MASK		0xf
#define	NQTXC_MSSIDX_L4LEN_SHIFT	8	/* L4 header len shift */
#define	NQTXC_MSSIDX_L4LEN_MASK		0xff
#define	NQTXC_MSSIDX_MSS_SHIFT		16	/* MSS */
#define	NQTXC_MSSIDX_MSS_MASK		0xffff