Version: v4.11.2

linux/drivers/message/fusion/mptbase.c

     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 
  1788 
  1789 
  1790 
  1791 
  1792 
  1793 
  1794 
  1795 
  1796 
  1797 
  1798 
  1799 
  1800 
  1801 
  1802 
  1803 
  1804 
  1805 
  1806 
  1807 
  1808 
  1809 
  1810 
  1811 
  1812 
  1813 
  1814 
  1815 
  1816 
  1817 
  1818 
  1819 
  1820 
  1821 
  1822 
  1823 
  1824 
  1825 
  1826 
  1827 
  1828 
  1829 
  1830 
  1831 
  1832 
  1833 
  1834 
  1835 
  1836 
  1837 
  1838 
  1839 
  1840 
  1841 
  1842 
  1843 
  1844 
  1845 
  1846 
  1847 
  1848 
  1849 
  1850 
  1851 
  1852 
  1853 
  1854 
  1855 
  1856 
  1857 
  1858 
  1859 
  1860 
  1861 
  1862 
  1863 
  1864 
  1865 
  1866 
  1867 
  1868 
  1869 
  1870 
  1871 
  1872 
  1873 
  1874 
  1875 
  1876 
  1877 
  1878 
  1879 
  1880 
  1881 
  1882 
  1883 
  1884 
  1885 
  1886 
  1887 
  1888 
  1889 
  1890 
  1891 
  1892 
  1893 
  1894 
  1895 
  1896 
  1897 
  1898 
  1899 
  1900 
  1901 
  1902 
  1903 
  1904 
  1905 
  1906 
  1907 
  1908 
  1909 
  1910 
  1911 
  1912 
  1913 
  1914 
  1915 
  1916 
  1917 
  1918 
  1919 
  1920 
  1921 
  1922 
  1923 
  1924 
  1925 
  1926 
  1927 
  1928 
  1929 
  1930 
  1931 
  1932 
  1933 
  1934 
  1935 
  1936 
  1937 
  1938 
  1939 
  1940 
  1941 
  1942 
  1943 
  1944 
  1945 
  1946 
  1947 
  1948 
  1949 
  1950 
  1951 
  1952 
  1953 
  1954 
  1955 
  1956 
  1957 
  1958 
  1959 
  1960 
  1961 
  1962 
  1963 
  1964 
  1965 
  1966 
  1967 
  1968 
  1969 
  1970 
  1971 
  1972 
  1973 
  1974 
  1975 
  1976 
  1977 
  1978 
  1979 
  1980 
  1981 
  1982 
  1983 
  1984 
  1985 
  1986 
  1987 
  1988 
  1989 
  1990 
  1991 
  1992 
  1993 
  1994 
  1995 
  1996 
  1997 
  1998 
  1999 
  2000 
  2001 
  2002 
  2003 
  2004 
  2005 
  2006 
  2007 
  2008 
  2009 
  2010 
  2011 
  2012 
  2013 
  2014 
  2015 
  2016 
  2017 
  2018 
  2019 
  2020 
  2021 
  2022 
  2023 
  2024 
  2025 
  2026 
  2027 
  2028 
  2029 
  2030 
  2031 
  2032 
  2033 
  2034 
  2035 
  2036 
  2037 
  2038 
  2039 
  2040 
  2041 
  2042 
  2043 
  2044 
  2045 
  2046 
  2047 
  2048 
  2049 
  2050 
  2051 
  2052 
  2053 
  2054 
  2055 
  2056 
  2057 
  2058 
  2059 
  2060 
  2061 
  2062 
  2063 
  2064 
  2065 
  2066 
  2067 
  2068 
  2069 
  2070 
  2071 
  2072 
  2073 
  2074 
  2075 
  2076 
  2077 
  2078 
  2079 
  2080 
  2081 
  2082 
  2083 
  2084 
  2085 
  2086 
  2087 
  2088 
  2089 
  2090 
  2091 
  2092 
  2093 
  2094 
  2095 
  2096 
  2097 
  2098 
  2099 
  2100 
  2101 
  2102 
  2103 
  2104 
  2105 
  2106 
  2107 
  2108 
  2109 
  2110 
  2111 
  2112 
  2113 
  2114 
  2115 
  2116 
  2117 
  2118 
  2119 
  2120 
  2121 
  2122 
  2123 
  2124 
  2125 
  2126 
  2127 
  2128 
  2129 
  2130 
  2131 
  2132 
  2133 
  2134 
  2135 
  2136 
  2137 
  2138 
  2139 
  2140 
  2141 
  2142 
  2143 
  2144 
  2145 
  2146 
  2147 
  2148 
  2149 
  2150 
  2151 
  2152 
  2153 
  2154 
  2155 
  2156 
  2157 
  2158 
  2159 
  2160 
  2161 
  2162 
  2163 
  2164 
  2165 
  2166 
  2167 
  2168 
  2169 
  2170 
  2171 
  2172 
  2173 
  2174 
  2175 
  2176 
  2177 
  2178 
  2179 
  2180 
  2181 
  2182 
  2183 
  2184 
  2185 
  2186 
  2187 
  2188 
  2189 
  2190 
  2191 
  2192 
  2193 
  2194 
  2195 
  2196 
  2197 
  2198 
  2199 
  2200 
  2201 
  2202 
  2203 
  2204 
  2205 
  2206 
  2207 
  2208 
  2209 
  2210 
  2211 
  2212 
  2213 
  2214 
  2215 
  2216 
  2217 
  2218 
  2219 
  2220 
  2221 
  2222 
  2223 
  2224 
  2225 
  2226 
  2227 
  2228 
  2229 
  2230 
  2231 
  2232 
  2233 
  2234 
  2235 
  2236 
  2237 
  2238 
  2239 
  2240 
  2241 
  2242 
  2243 
  2244 
  2245 
  2246 
  2247 
  2248 
  2249 
  2250 
  2251 
  2252 
  2253 
  2254 
  2255 
  2256 
  2257 
  2258 
  2259 
  2260 
  2261 
  2262 
  2263 
  2264 
  2265 
  2266 
  2267 
  2268 
  2269 
  2270 
  2271 
  2272 
  2273 
  2274 
  2275 
  2276 
  2277 
  2278 
  2279 
  2280 
  2281 
  2282 
  2283 
  2284 
  2285 
  2286 
  2287 
  2288 
  2289 
  2290 
  2291 
  2292 
  2293 
  2294 
  2295 
  2296 
  2297 
  2298 
  2299 
  2300 
  2301 
  2302 
  2303 
  2304 
  2305 
  2306 
  2307 
  2308 
  2309 
  2310 
  2311 
  2312 
  2313 
  2314 
  2315 
  2316 
  2317 
  2318 
  2319 
  2320 
  2321 
  2322 
  2323 
  2324 
  2325 
  2326 
  2327 
  2328 
  2329 
  2330 
  2331 
  2332 
  2333 
  2334 
  2335 
  2336 
  2337 
  2338 
  2339 
  2340 
  2341 
  2342 
  2343 
  2344 
  2345 
  2346 
  2347 
  2348 
  2349 
  2350 
  2351 
  2352 
  2353 
  2354 
  2355 
  2356 
  2357 
  2358 
  2359 
  2360 
  2361 
  2362 
  2363 
  2364 
  2365 
  2366 
  2367 
  2368 
  2369 
  2370 
  2371 
  2372 
  2373 
  2374 
  2375 
  2376 
  2377 
  2378 
  2379 
  2380 
  2381 
  2382 
  2383 
  2384 
  2385 
  2386 
  2387 
  2388 
  2389 
  2390 
  2391 
  2392 
  2393 
  2394 
  2395 
  2396 
  2397 
  2398 
  2399 
  2400 
  2401 
  2402 
  2403 
  2404 
  2405 
  2406 
  2407 
  2408 
  2409 
  2410 
  2411 
  2412 
  2413 
  2414 
  2415 
  2416 
  2417 
  2418 
  2419 
  2420 
  2421 
  2422 
  2423 
  2424 
  2425 
  2426 
  2427 
  2428 
  2429 
  2430 
  2431 
  2432 
  2433 
  2434 
  2435 
  2436 
  2437 
  2438 
  2439 
  2440 
  2441 
  2442 
  2443 
  2444 
  2445 
  2446 
  2447 
  2448 
  2449 
  2450 
  2451 
  2452 
  2453 
  2454 
  2455 
  2456 
  2457 
  2458 
  2459 
  2460 
  2461 
  2462 
  2463 
  2464 
  2465 
  2466 
  2467 
  2468 
  2469 
  2470 
  2471 
  2472 
  2473 
  2474 
  2475 
  2476 
  2477 
  2478 
  2479 
  2480 
  2481 
  2482 
  2483 
  2484 
  2485 
  2486 
  2487 
  2488 
  2489 
  2490 
  2491 
  2492 
  2493 
  2494 
  2495 
  2496 
  2497 
  2498 
  2499 
  2500 
  2501 
  2502 
  2503 
  2504 
  2505 
  2506 
  2507 
  2508 
  2509 
  2510 
  2511 
  2512 
  2513 
  2514 
  2515 
  2516 
  2517 
  2518 
  2519 
  2520 
  2521 
  2522 
  2523 
  2524 
  2525 
  2526 
  2527 
  2528 
  2529 
  2530 
  2531 
  2532 
  2533 
  2534 
  2535 
  2536 
  2537 
  2538 
  2539 
  2540 
  2541 
  2542 
  2543 
  2544 
  2545 
  2546 
  2547 
  2548 
  2549 
  2550 
  2551 
  2552 
  2553 
  2554 
  2555 
  2556 
  2557 
  2558 
  2559 
  2560 
  2561 
  2562 
  2563 
  2564 
  2565 
  2566 
  2567 
  2568 
  2569 
  2570 
  2571 
  2572 
  2573 
  2574 
  2575 
  2576 
  2577 
  2578 
  2579 
  2580 
  2581 
  2582 
  2583 
  2584 
  2585 
  2586 
  2587 
  2588 
  2589 
  2590 
  2591 
  2592 
  2593 
  2594 
  2595 
  2596 
  2597 
  2598 
  2599 
  2600 
  2601 
  2602 
  2603 
  2604 
  2605 
  2606 
  2607 
  2608 
  2609 
  2610 
  2611 
  2612 
  2613 
  2614 
  2615 
  2616 
  2617 
  2618 
  2619 
  2620 
  2621 
  2622 
  2623 
  2624 
  2625 
  2626 
  2627 
  2628 
  2629 
  2630 
  2631 
  2632 
  2633 
  2634 
  2635 
  2636 
  2637 
  2638 
  2639 
  2640 
  2641 
  2642 
  2643 
  2644 
  2645 
  2646 
  2647 
  2648 
  2649 
  2650 
  2651 
  2652 
  2653 
  2654 
  2655 
  2656 
  2657 
  2658 
  2659 
  2660 
  2661 
  2662 
  2663 
  2664 
  2665 
  2666 
  2667 
  2668 
  2669 
  2670 
  2671 
  2672 
  2673 
  2674 
  2675 
  2676 
  2677 
  2678 
  2679 
  2680 
  2681 
  2682 
  2683 
  2684 
  2685 
  2686 
  2687 
  2688 
  2689 
  2690 
  2691 
  2692 
  2693 
  2694 
  2695 
  2696 
  2697 
  2698 
  2699 
  2700 
  2701 
  2702 
  2703 
  2704 
  2705 
  2706 
  2707 
  2708 
  2709 
  2710 
  2711 
  2712 
  2713 
  2714 
  2715 
  2716 
  2717 
  2718 
  2719 
  2720 
  2721 
  2722 
  2723 
  2724 
  2725 
  2726 
  2727 
  2728 
  2729 
  2730 
  2731 
  2732 
  2733 
  2734 
  2735 
  2736 
  2737 
  2738 
  2739 
  2740 
  2741 
  2742 
  2743 
  2744 
  2745 
  2746 
  2747 
  2748 
  2749 
  2750 
  2751 
  2752 
  2753 
  2754 
  2755 
  2756 
  2757 
  2758 
  2759 
  2760 
  2761 
  2762 
  2763 
  2764 
  2765 
  2766 
  2767 
  2768 
  2769 
  2770 
  2771 
  2772 
  2773 
  2774 
  2775 
  2776 
  2777 
  2778 
  2779 
  2780 
  2781 
  2782 
  2783 
  2784 
  2785 
  2786 
  2787 
  2788 
  2789 
  2790 
  2791 
  2792 
  2793 
  2794 
  2795 
  2796 
  2797 
  2798 
  2799 
  2800 
  2801 
  2802 
  2803 
  2804 
  2805 
  2806 
  2807 
  2808 
  2809 
  2810 
  2811 
  2812 
  2813 
  2814 
  2815 
  2816 
  2817 
  2818 
  2819 
  2820 
  2821 
  2822 
  2823 
  2824 
  2825 
  2826 
  2827 
  2828 
  2829 
  2830 
  2831 
  2832 
  2833 
  2834 
  2835 
  2836 
  2837 
  2838 
  2839 
  2840 
  2841 
  2842 
  2843 
  2844 
  2845 
  2846 
  2847 
  2848 
  2849 
  2850 
  2851 
  2852 
  2853 
  2854 
  2855 
  2856 
  2857 
  2858 
  2859 
  2860 
  2861 
  2862 
  2863 
  2864 
  2865 
  2866 
  2867 
  2868 
  2869 
  2870 
  2871 
  2872 
  2873 
  2874 
  2875 
  2876 
  2877 
  2878 
  2879 
  2880 
  2881 
  2882 
  2883 
  2884 
  2885 
  2886 
  2887 
  2888 
  2889 
  2890 
  2891 
  2892 
  2893 
  2894 
  2895 
  2896 
  2897 
  2898 
  2899 
  2900 
  2901 
  2902 
  2903 
  2904 
  2905 
  2906 
  2907 
  2908 
  2909 
  2910 
  2911 
  2912 
  2913 
  2914 
  2915 
  2916 
  2917 
  2918 
  2919 
  2920 
  2921 
  2922 
  2923 
  2924 
  2925 
  2926 
  2927 
  2928 
  2929 
  2930 
  2931 
  2932 
  2933 
  2934 
  2935 
  2936 
  2937 
  2938 
  2939 
  2940 
  2941 
  2942 
  2943 
  2944 
  2945 
  2946 
  2947 
  2948 
  2949 
  2950 
  2951 
  2952 
  2953 
  2954 
  2955 
  2956 
  2957 
  2958 
  2959 
  2960 
  2961 
  2962 
  2963 
  2964 
  2965 
  2966 
  2967 
  2968 
  2969 
  2970 
  2971 
  2972 
  2973 
  2974 
  2975 
  2976 
  2977 
  2978 
  2979 
  2980 
  2981 
  2982 
  2983 
  2984 
  2985 
  2986 
  2987 
  2988 
  2989 
  2990 
  2991 
  2992 
  2993 
  2994 
  2995 
  2996 
  2997 
  2998 
  2999 
  3000 
  3001 
  3002 
  3003 
  3004 
  3005 
  3006 
  3007 
  3008 
  3009 
  3010 
  3011 
  3012 
  3013 
  3014 
  3015 
  3016 
  3017 
  3018 
  3019 
  3020 
  3021 
  3022 
  3023 
  3024 
  3025 
  3026 
  3027 
  3028 
  3029 
  3030 
  3031 
  3032 
  3033 
  3034 
  3035 
  3036 
  3037 
  3038 
  3039 
  3040 
  3041 
  3042 
  3043 
  3044 
  3045 
  3046 
  3047 
  3048 
  3049 
  3050 
  3051 
  3052 
  3053 
  3054 
  3055 
  3056 
  3057 
  3058 
  3059 
  3060 
  3061 
  3062 
  3063 
  3064 
  3065 
  3066 
  3067 
  3068 
  3069 
  3070 
  3071 
  3072 
  3073 
  3074 
  3075 
  3076 
  3077 
  3078 
  3079 
  3080 
  3081 
  3082 
  3083 
  3084 
  3085 
  3086 
  3087 
  3088 
  3089 
  3090 
  3091 
  3092 
  3093 
  3094 
  3095 
  3096 
  3097 
  3098 
  3099 
  3100 
  3101 
  3102 
  3103 
  3104 
  3105 
  3106 
  3107 
  3108 
  3109 
  3110 
  3111 
  3112 
  3113 
  3114 
  3115 
  3116 
  3117 
  3118 
  3119 
  3120 
  3121 
  3122 
  3123 
  3124 
  3125 
  3126 
  3127 
  3128 
  3129 
  3130 
  3131 
  3132 
  3133 
  3134 
  3135 
  3136 
  3137 
  3138 
  3139 
  3140 
  3141 
  3142 
  3143 
  3144 
  3145 
  3146 
  3147 
  3148 
  3149 
  3150 
  3151 
  3152 
  3153 
  3154 
  3155 
  3156 
  3157 
  3158 
  3159 
  3160 
  3161 
  3162 
  3163 
  3164 
  3165 
  3166 
  3167 
  3168 
  3169 
  3170 
  3171 
  3172 
  3173 
  3174 
  3175 
  3176 
  3177 
  3178 
  3179 
  3180 
  3181 
  3182 
  3183 
  3184 
  3185 
  3186 
  3187 
  3188 
  3189 
  3190 
  3191 
  3192 
  3193 
  3194 
  3195 
  3196 
  3197 
  3198 
  3199 
  3200 
  3201 
  3202 
  3203 
  3204 
  3205 
  3206 
  3207 
  3208 
  3209 
  3210 
  3211 
  3212 
  3213 
  3214 
  3215 
  3216 
  3217 
  3218 
  3219 
  3220 
  3221 
  3222 
  3223 
  3224 
  3225 
  3226 
  3227 
  3228 
  3229 
  3230 
  3231 
  3232 
  3233 
  3234 
  3235 
  3236 
  3237 
  3238 
  3239 
  3240 
  3241 
  3242 
  3243 
  3244 
  3245 
  3246 
  3247 
  3248 
  3249 
  3250 
  3251 
  3252 
  3253 
  3254 
  3255 
  3256 
  3257 
  3258 
  3259 
  3260 
  3261 
  3262 
  3263 
  3264 
  3265 
  3266 
  3267 
  3268 
  3269 
  3270 
  3271 
  3272 
  3273 
  3274 
  3275 
  3276 
  3277 
  3278 
  3279 
  3280 
  3281 
  3282 
  3283 
  3284 
  3285 
  3286 
  3287 
  3288 
  3289 
  3290 
  3291 
  3292 
  3293 
  3294 
  3295 
  3296 
  3297 
  3298 
  3299 
  3300 
  3301 
  3302 
  3303 
  3304 
  3305 
  3306 
  3307 
  3308 
  3309 
  3310 
  3311 
  3312 
  3313 
  3314 
  3315 
  3316 
  3317 
  3318 
  3319 
  3320 
  3321 
  3322 
  3323 
  3324 
  3325 
  3326 
  3327 
  3328 
  3329 
  3330 
  3331 
  3332 
  3333 
  3334 
  3335 
  3336 
  3337 
  3338 
  3339 
  3340 
  3341 
  3342 
  3343 
  3344 
  3345 
  3346 
  3347 
  3348 
  3349 
  3350 
  3351 
  3352 
  3353 
  3354 
  3355 
  3356 
  3357 
  3358 
  3359 
  3360 
  3361 
  3362 
  3363 
  3364 
  3365 
  3366 
  3367 
  3368 
  3369 
  3370 
  3371 
  3372 
  3373 
  3374 
  3375 
  3376 
  3377 
  3378 
  3379 
  3380 
  3381 
  3382 
  3383 
  3384 
  3385 
  3386 
  3387 
  3388 
  3389 
  3390 
  3391 
  3392 
  3393 
  3394 
  3395 
  3396 
  3397 
  3398 
  3399 
  3400 
  3401 
  3402 
  3403 
  3404 
  3405 
  3406 
  3407 
  3408 
  3409 
  3410 
  3411 
  3412 
  3413 
  3414 
  3415 
  3416 
  3417 
  3418 
  3419 
  3420 
  3421 
  3422 
  3423 
  3424 
  3425 
  3426 
  3427 
  3428 
  3429 
  3430 
  3431 
  3432 
  3433 
  3434 
  3435 
  3436 
  3437 
  3438 
  3439 
  3440 
  3441 
  3442 
  3443 
  3444 
  3445 
  3446 
  3447 
  3448 
  3449 
  3450 
  3451 
  3452 
  3453 
  3454 
  3455 
  3456 
  3457 
  3458 
  3459 
  3460 
  3461 
  3462 
  3463 
  3464 
  3465 
  3466 
  3467 
  3468 
  3469 
  3470 
  3471 
  3472 
  3473 
  3474 
  3475 
  3476 
  3477 
  3478 
  3479 
  3480 
  3481 
  3482 
  3483 
  3484 
  3485 
  3486 
  3487 
  3488 
  3489 
  3490 
  3491 
  3492 
  3493 
  3494 
  3495 
  3496 
  3497 
  3498 
  3499 
  3500 
  3501 
  3502 
  3503 
  3504 
  3505 
  3506 
  3507 
  3508 
  3509 
  3510 
  3511 
  3512 
  3513 
  3514 
  3515 
  3516 
  3517 
  3518 
  3519 
  3520 
  3521 
  3522 
  3523 
  3524 
  3525 
  3526 
  3527 
  3528 
  3529 
  3530 
  3531 
  3532 
  3533 
  3534 
  3535 
  3536 
  3537 
  3538 
  3539 
  3540 
  3541 
  3542 
  3543 
  3544 
  3545 
  3546 
  3547 
  3548 
  3549 
  3550 
  3551 
  3552 
  3553 
  3554 
  3555 
  3556 
  3557 
  3558 
  3559 
  3560 
  3561 
  3562 
  3563 
  3564 
  3565 
  3566 
  3567 
  3568 
  3569 
  3570 
  3571 
  3572 
  3573 
  3574 
  3575 
  3576 
  3577 
  3578 
  3579 
  3580 
  3581 
  3582 
  3583 
  3584 
  3585 
  3586 
  3587 
  3588 
  3589 
  3590 
  3591 
  3592 
  3593 
  3594 
  3595 
  3596 
  3597 
  3598 
  3599 
  3600 
  3601 
  3602 
  3603 
  3604 
  3605 
  3606 
  3607 
  3608 
  3609 
  3610 
  3611 
  3612 
  3613 
  3614 
  3615 
  3616 
  3617 
  3618 
  3619 
  3620 
  3621 
  3622 
  3623 
  3624 
  3625 
  3626 
  3627 
  3628 
  3629 
  3630 
  3631 
  3632 
  3633 
  3634 
  3635 
  3636 
  3637 
  3638 
  3639 
  3640 
  3641 
  3642 
  3643 
  3644 
  3645 
  3646 
  3647 
  3648 
  3649 
  3650 
  3651 
  3652 
  3653 
  3654 
  3655 
  3656 
  3657 
  3658 
  3659 
  3660 
  3661 
  3662 
  3663 
  3664 
  3665 
  3666 
  3667 
  3668 
  3669 
  3670 
  3671 
  3672 
  3673 
  3674 
  3675 
  3676 
  3677 
  3678 
  3679 
  3680 
  3681 
  3682 
  3683 
  3684 
  3685 
  3686 
  3687 
  3688 
  3689 
  3690 
  3691 
  3692 
  3693 
  3694 
  3695 
  3696 
  3697 
  3698 
  3699 
  3700 
  3701 
  3702 
  3703 
  3704 
  3705 
  3706 
  3707 
  3708 
  3709 
  3710 
  3711 
  3712 
  3713 
  3714 
  3715 
  3716 
  3717 
  3718 
  3719 
  3720 
  3721 
  3722 
  3723 
  3724 
  3725 
  3726 
  3727 
  3728 
  3729 
  3730 
  3731 
  3732 
  3733 
  3734 
  3735 
  3736 
  3737 
  3738 
  3739 
  3740 
  3741 
  3742 
  3743 
  3744 
  3745 
  3746 
  3747 
  3748 
  3749 
  3750 
  3751 
  3752 
  3753 
  3754 
  3755 
  3756 
  3757 
  3758 
  3759 
  3760 
  3761 
  3762 
  3763 
  3764 
  3765 
  3766 
  3767 
  3768 
  3769 
  3770 
  3771 
  3772 
  3773 
  3774 
  3775 
  3776 
  3777 
  3778 
  3779 
  3780 
  3781 
  3782 
  3783 
  3784 
  3785 
  3786 
  3787 
  3788 
  3789 
  3790 
  3791 
  3792 
  3793 
  3794 
  3795 
  3796 
  3797 
  3798 
  3799 
  3800 
  3801 
  3802 
  3803 
  3804 
  3805 
  3806 
  3807 
  3808 
  3809 
  3810 
  3811 
  3812 
  3813 
  3814 
  3815 
  3816 
  3817 
  3818 
  3819 
  3820 
  3821 
  3822 
  3823 
  3824 
  3825 
  3826 
  3827 
  3828 
  3829 
  3830 
  3831 
  3832 
  3833 
  3834 
  3835 
  3836 
  3837 
  3838 
  3839 
  3840 
  3841 
  3842 
  3843 
  3844 
  3845 
  3846 
  3847 
  3848 
  3849 
  3850 
  3851 
  3852 
  3853 
  3854 
  3855 
  3856 
  3857 
  3858 
  3859 
  3860 
  3861 
  3862 
  3863 
  3864 
  3865 
  3866 
  3867 
  3868 
  3869 
  3870 
  3871 
  3872 
  3873 
  3874 
  3875 
  3876 
  3877 
  3878 
  3879 
  3880 
  3881 
  3882 
  3883 
  3884 
  3885 
  3886 
  3887 
  3888 
  3889 
  3890 
  3891 
  3892 
  3893 
  3894 
  3895 
  3896 
  3897 
  3898 
  3899 
  3900 
  3901 
  3902 
  3903 
  3904 
  3905 
  3906 
  3907 
  3908 
  3909 
  3910 
  3911 
  3912 
  3913 
  3914 
  3915 
  3916 
  3917 
  3918 
  3919 
  3920 
  3921 
  3922 
  3923 
  3924 
  3925 
  3926 
  3927 
  3928 
  3929 
  3930 
  3931 
  3932 
  3933 
  3934 
  3935 
  3936 
  3937 
  3938 
  3939 
  3940 
  3941 
  3942 
  3943 
  3944 
  3945 
  3946 
  3947 
  3948 
  3949 
  3950 
  3951 
  3952 
  3953 
  3954 
  3955 
  3956 
  3957 
  3958 
  3959 
  3960 
  3961 
  3962 
  3963 
  3964 
  3965 
  3966 
  3967 
  3968 
  3969 
  3970 
  3971 
  3972 
  3973 
  3974 
  3975 
  3976 
  3977 
  3978 
  3979 
  3980 
  3981 
  3982 
  3983 
  3984 
  3985 
  3986 
  3987 
  3988 
  3989 
  3990 
  3991 
  3992 
  3993 
  3994 
  3995 
  3996 
  3997 
  3998 
  3999 
  4000 
  4001 
  4002 
  4003 
  4004 
  4005 
  4006 
  4007 
  4008 
  4009 
  4010 
  4011 
  4012 
  4013 
  4014 
  4015 
  4016 
  4017 
  4018 
  4019 
  4020 
  4021 
  4022 
  4023 
  4024 
  4025 
  4026 
  4027 
  4028 
  4029 
  4030 
  4031 
  4032 
  4033 
  4034 
  4035 
  4036 
  4037 
  4038 
  4039 
  4040 
  4041 
  4042 
  4043 
  4044 
  4045 
  4046 
  4047 
  4048 
  4049 
  4050 
  4051 
  4052 
  4053 
  4054 
  4055 
  4056 
  4057 
  4058 
  4059 
  4060 
  4061 
  4062 
  4063 
  4064 
  4065 
  4066 
  4067 
  4068 
  4069 
  4070 
  4071 
  4072 
  4073 
  4074 
  4075 
  4076 
  4077 
  4078 
  4079 
  4080 
  4081 
  4082 
  4083 
  4084 
  4085 
  4086 
  4087 
  4088 
  4089 
  4090 
  4091 
  4092 
  4093 
  4094 
  4095 
  4096 
  4097 
  4098 
  4099 
  4100 
  4101 
  4102 
  4103 
  4104 
  4105 
  4106 
  4107 
  4108 
  4109 
  4110 
  4111 
  4112 
  4113 
  4114 
  4115 
  4116 
  4117 
  4118 
  4119 
  4120 
  4121 
  4122 
  4123 
  4124 
  4125 
  4126 
  4127 
  4128 
  4129 
  4130 
  4131 
  4132 
  4133 
  4134 
  4135 
  4136 
  4137 
  4138 
  4139 
  4140 
  4141 
  4142 
  4143 
  4144 
  4145 
  4146 
  4147 
  4148 
  4149 
  4150 
  4151 
  4152 
  4153 
  4154 
  4155 
  4156 
  4157 
  4158 
  4159 
  4160 
  4161 
  4162 
  4163 
  4164 
  4165 
  4166 
  4167 
  4168 
  4169 
  4170 
  4171 
  4172 
  4173 
  4174 
  4175 
  4176 
  4177 
  4178 
  4179 
  4180 
  4181 
  4182 
  4183 
  4184 
  4185 
  4186 
  4187 
  4188 
  4189 
  4190 
  4191 
  4192 
  4193 
  4194 
  4195 
  4196 
  4197 
  4198 
  4199 
  4200 
  4201 
  4202 
  4203 
  4204 
  4205 
  4206 
  4207 
  4208 
  4209 
  4210 
  4211 
  4212 
  4213 
  4214 
  4215 
  4216 
  4217 
  4218 
  4219 
  4220 
  4221 
  4222 
  4223 
  4224 
  4225 
  4226 
  4227 
  4228 
  4229 
  4230 
  4231 
  4232 
  4233 
  4234 
  4235 
  4236 
  4237 
  4238 
  4239 
  4240 
  4241 
  4242 
  4243 
  4244 
  4245 
  4246 
  4247 
  4248 
  4249 
  4250 
  4251 
  4252 
  4253 
  4254 
  4255 
  4256 
  4257 
  4258 
  4259 
  4260 
  4261 
  4262 
  4263 
  4264 
  4265 
  4266 
  4267 
  4268 
  4269 
  4270 
  4271 
  4272 
  4273 
  4274 
  4275 
  4276 
  4277 
  4278 
  4279 
  4280 
  4281 
  4282 
  4283 
  4284 
  4285 
  4286 
  4287 
  4288 
  4289 
  4290 
  4291 
  4292 
  4293 
  4294 
  4295 
  4296 
  4297 
  4298 
  4299 
  4300 
  4301 
  4302 
  4303 
  4304 
  4305 
  4306 
  4307 
  4308 
  4309 
  4310 
  4311 
  4312 
  4313 
  4314 
  4315 
  4316 
  4317 
  4318 
  4319 
  4320 
  4321 
  4322 
  4323 
  4324 
  4325 
  4326 
  4327 
  4328 
  4329 
  4330 
  4331 
  4332 
  4333 
  4334 
  4335 
  4336 
  4337 
  4338 
  4339 
  4340 
  4341 
  4342 
  4343 
  4344 
  4345 
  4346 
  4347 
  4348 
  4349 
  4350 
  4351 
  4352 
  4353 
  4354 
  4355 
  4356 
  4357 
  4358 
  4359 
  4360 
  4361 
  4362 
  4363 
  4364 
  4365 
  4366 
  4367 
  4368 
  4369 
  4370 
  4371 
  4372 
  4373 
  4374 
  4375 
  4376 
  4377 
  4378 
  4379 
  4380 
  4381 
  4382 
  4383 
  4384 
  4385 
  4386 
  4387 
  4388 
  4389 
  4390 
  4391 
  4392 
  4393 
  4394 
  4395 
  4396 
  4397 
  4398 
  4399 
  4400 
  4401 
  4402 
  4403 
  4404 
  4405 
  4406 
  4407 
  4408 
  4409 
  4410 
  4411 
  4412 
  4413 
  4414 
  4415 
  4416 
  4417 
  4418 
  4419 
  4420 
  4421 
  4422 
  4423 
  4424 
  4425 
  4426 
  4427 
  4428 
  4429 
  4430 
  4431 
  4432 
  4433 
  4434 
  4435 
  4436 
  4437 
  4438 
  4439 
  4440 
  4441 
  4442 
  4443 
  4444 
  4445 
  4446 
  4447 
  4448 
  4449 
  4450 
  4451 
  4452 
  4453 
  4454 
  4455 
  4456 
  4457 
  4458 
  4459 
  4460 
  4461 
  4462 
  4463 
  4464 
  4465 
  4466 
  4467 
  4468 
  4469 
  4470 
  4471 
  4472 
  4473 
  4474 
  4475 
  4476 
  4477 
  4478 
  4479 
  4480 
  4481 
  4482 
  4483 
  4484 
  4485 
  4486 
  4487 
  4488 
  4489 
  4490 
  4491 
  4492 
  4493 
  4494 
  4495 
  4496 
  4497 
  4498 
  4499 
  4500 
  4501 
  4502 
  4503 
  4504 
  4505 
  4506 
  4507 
  4508 
  4509 
  4510 
  4511 
  4512 
  4513 
  4514 
  4515 
  4516 
  4517 
  4518 
  4519 
  4520 
  4521 
  4522 
  4523 
  4524 
  4525 
  4526 
  4527 
  4528 
  4529 
  4530 
  4531 
  4532 
  4533 
  4534 
  4535 
  4536 
  4537 
  4538 
  4539 
  4540 
  4541 
  4542 
  4543 
  4544 
  4545 
  4546 
  4547 
  4548 
  4549 
  4550 
  4551 
  4552 
  4553 
  4554 
  4555 
  4556 
  4557 
  4558 
  4559 
  4560 
  4561 
  4562 
  4563 
  4564 
  4565 
  4566 
  4567 
  4568 
  4569 
  4570 
  4571 
  4572 
  4573 
  4574 
  4575 
  4576 
  4577 
  4578 
  4579 
  4580 
  4581 
  4582 
  4583 
  4584 
  4585 
  4586 
  4587 
  4588 
  4589 
  4590 
  4591 
  4592 
  4593 
  4594 
  4595 
  4596 
  4597 
  4598 
  4599 
  4600 
  4601 
  4602 
  4603 
  4604 
  4605 
  4606 
  4607 
  4608 
  4609 
  4610 
  4611 
  4612 
  4613 
  4614 
  4615 
  4616 
  4617 
  4618 
  4619 
  4620 
  4621 
  4622 
  4623 
  4624 
  4625 
  4626 
  4627 
  4628 
  4629 
  4630 
  4631 
  4632 
  4633 
  4634 
  4635 
  4636 
  4637 
  4638 
  4639 
  4640 
  4641 
  4642 
  4643 
  4644 
  4645 
  4646 
  4647 
  4648 
  4649 
  4650 
  4651 
  4652 
  4653 
  4654 
  4655 
  4656 
  4657 
  4658 
  4659 
  4660 
  4661 
  4662 
  4663 
  4664 
  4665 
  4666 
  4667 
  4668 
  4669 
  4670 
  4671 
  4672 
  4673 
  4674 
  4675 
  4676 
  4677 
  4678 
  4679 
  4680 
  4681 
  4682 
  4683 
  4684 
  4685 
  4686 
  4687 
  4688 
  4689 
  4690 
  4691 
  4692 
  4693 
  4694 
  4695 
  4696 
  4697 
  4698 
  4699 
  4700 
  4701 
  4702 
  4703 
  4704 
  4705 
  4706 
  4707 
  4708 
  4709 
  4710 
  4711 
  4712 
  4713 
  4714 
  4715 
  4716 
  4717 
  4718 
  4719 
  4720 
  4721 
  4722 
  4723 
  4724 
  4725 
  4726 
  4727 
  4728 
  4729 
  4730 
  4731 
  4732 
  4733 
  4734 
  4735 
  4736 
  4737 
  4738 
  4739 
  4740 
  4741 
  4742 
  4743 
  4744 
  4745 
  4746 
  4747 
  4748 
  4749 
  4750 
  4751 
  4752 
  4753 
  4754 
  4755 
  4756 
  4757 
  4758 
  4759 
  4760 
  4761 
  4762 
  4763 
  4764 
  4765 
  4766 
  4767 
  4768 
  4769 
  4770 
  4771 
  4772 
  4773 
  4774 
  4775 
  4776 
  4777 
  4778 
  4779 
  4780 
  4781 
  4782 
  4783 
  4784 
  4785 
  4786 
  4787 
  4788 
  4789 
  4790 
  4791 
  4792 
  4793 
  4794 
  4795 
  4796 
  4797 
  4798 
  4799 
  4800 
  4801 
  4802 
  4803 
  4804 
  4805 
  4806 
  4807 
  4808 
  4809 
  4810 
  4811 
  4812 
  4813 
  4814 
  4815 
  4816 
  4817 
  4818 
  4819 
  4820 
  4821 
  4822 
  4823 
  4824 
  4825 
  4826 
  4827 
  4828 
  4829 
  4830 
  4831 
  4832 
  4833 
  4834 
  4835 
  4836 
  4837 
  4838 
  4839 
  4840 
  4841 
  4842 
  4843 
  4844 
  4845 
  4846 
  4847 
  4848 
  4849 
  4850 
  4851 
  4852 
  4853 
  4854 
  4855 
  4856 
  4857 
  4858 
  4859 
  4860 
  4861 
  4862 
  4863 
  4864 
  4865 
  4866 
  4867 
  4868 
  4869 
  4870 
  4871 
  4872 
  4873 
  4874 
  4875 
  4876 
  4877 
  4878 
  4879 
  4880 
  4881 
  4882 
  4883 
  4884 
  4885 
  4886 
  4887 
  4888 
  4889 
  4890 
  4891 
  4892 
  4893 
  4894 
  4895 
  4896 
  4897 
  4898 
  4899 
  4900 
  4901 
  4902 
  4903 
  4904 
  4905 
  4906 
  4907 
  4908 
  4909 
  4910 
  4911 
  4912 
  4913 
  4914 
  4915 
  4916 
  4917 
  4918 
  4919 
  4920 
  4921 
  4922 
  4923 
  4924 
  4925 
  4926 
  4927 
  4928 
  4929 
  4930 
  4931 
  4932 
  4933 
  4934 
  4935 
  4936 
  4937 
  4938 
  4939 
  4940 
  4941 
  4942 
  4943 
  4944 
  4945 
  4946 
  4947 
  4948 
  4949 
  4950 
  4951 
  4952 
  4953 
  4954 
  4955 
  4956 
  4957 
  4958 
  4959 
  4960 
  4961 
  4962 
  4963 
  4964 
  4965 
  4966 
  4967 
  4968 
  4969 
  4970 
  4971 
  4972 
  4973 
  4974 
  4975 
  4976 
  4977 
  4978 
  4979 
  4980 
  4981 
  4982 
  4983 
  4984 
  4985 
  4986 
  4987 
  4988 
  4989 
  4990 
  4991 
  4992 
  4993 
  4994 
  4995 
  4996 
  4997 
  4998 
  4999 
  5000 
  5001 
  5002 
  5003 
  5004 
  5005 
  5006 
  5007 
  5008 
  5009 
  5010 
  5011 
  5012 
  5013 
  5014 
  5015 
  5016 
  5017 
  5018 
  5019 
  5020 
  5021 
  5022 
  5023 
  5024 
  5025 
  5026 
  5027 
  5028 
  5029 
  5030 
  5031 
  5032 
  5033 
  5034 
  5035 
  5036 
  5037 
  5038 
  5039 
  5040 
  5041 
  5042 
  5043 
  5044 
  5045 
  5046 
  5047 
  5048 
  5049 
  5050 
  5051 
  5052 
  5053 
  5054 
  5055 
  5056 
  5057 
  5058 
  5059 
  5060 
  5061 
  5062 
  5063 
  5064 
  5065 
  5066 
  5067 
  5068 
  5069 
  5070 
  5071 
  5072 
  5073 
  5074 
  5075 
  5076 
  5077 
  5078 
  5079 
  5080 
  5081 
  5082 
  5083 
  5084 
  5085 
  5086 
  5087 
  5088 
  5089 
  5090 
  5091 
  5092 
  5093 
  5094 
  5095 
  5096 
  5097 
  5098 
  5099 
  5100 
  5101 
  5102 
  5103 
  5104 
  5105 
  5106 
  5107 
  5108 
  5109 
  5110 
  5111 
  5112 
  5113 
  5114 
  5115 
  5116 
  5117 
  5118 
  5119 
  5120 
  5121 
  5122 
  5123 
  5124 
  5125 
  5126 
  5127 
  5128 
  5129 
  5130 
  5131 
  5132 
  5133 
  5134 
  5135 
  5136 
  5137 
  5138 
  5139 
  5140 
  5141 
  5142 
  5143 
  5144 
  5145 
  5146 
  5147 
  5148 
  5149 
  5150 
  5151 
  5152 
  5153 
  5154 
  5155 
  5156 
  5157 
  5158 
  5159 
  5160 
  5161 
  5162 
  5163 
  5164 
  5165 
  5166 
  5167 
  5168 
  5169 
  5170 
  5171 
  5172 
  5173 
  5174 
  5175 
  5176 
  5177 
  5178 
  5179 
  5180 
  5181 
  5182 
  5183 
  5184 
  5185 
  5186 
  5187 
  5188 
  5189 
  5190 
  5191 
  5192 
  5193 
  5194 
  5195 
  5196 
  5197 
  5198 
  5199 
  5200 
  5201 
  5202 
  5203 
  5204 
  5205 
  5206 
  5207 
  5208 
  5209 
  5210 
  5211 
  5212 
  5213 
  5214 
  5215 
  5216 
  5217 
  5218 
  5219 
  5220 
  5221 
  5222 
  5223 
  5224 
  5225 
  5226 
  5227 
  5228 
  5229 
  5230 
  5231 
  5232 
  5233 
  5234 
  5235 
  5236 
  5237 
  5238 
  5239 
  5240 
  5241 
  5242 
  5243 
  5244 
  5245 
  5246 
  5247 
  5248 
  5249 
  5250 
  5251 
  5252 
  5253 
  5254 
  5255 
  5256 
  5257 
  5258 
  5259 
  5260 
  5261 
  5262 
  5263 
  5264 
  5265 
  5266 
  5267 
  5268 
  5269 
  5270 
  5271 
  5272 
  5273 
  5274 
  5275 
  5276 
  5277 
  5278 
  5279 
  5280 
  5281 
  5282 
  5283 
  5284 
  5285 
  5286 
  5287 
  5288 
  5289 
  5290 
  5291 
  5292 
  5293 
  5294 
  5295 
  5296 
  5297 
  5298 
  5299 
  5300 
  5301 
  5302 
  5303 
  5304 
  5305 
  5306 
  5307 
  5308 
  5309 
  5310 
  5311 
  5312 
  5313 
  5314 
  5315 
  5316 
  5317 
  5318 
  5319 
  5320 
  5321 
  5322 
  5323 
  5324 
  5325 
  5326 
  5327 
  5328 
  5329 
  5330 
  5331 
  5332 
  5333 
  5334 
  5335 
  5336 
  5337 
  5338 
  5339 
  5340 
  5341 
  5342 
  5343 
  5344 
  5345 
  5346 
  5347 
  5348 
  5349 
  5350 
  5351 
  5352 
  5353 
  5354 
  5355 
  5356 
  5357 
  5358 
  5359 
  5360 
  5361 
  5362 
  5363 
  5364 
  5365 
  5366 
  5367 
  5368 
  5369 
  5370 
  5371 
  5372 
  5373 
  5374 
  5375 
  5376 
  5377 
  5378 
  5379 
  5380 
  5381 
  5382 
  5383 
  5384 
  5385 
  5386 
  5387 
  5388 
  5389 
  5390 
  5391 
  5392 
  5393 
  5394 
  5395 
  5396 
  5397 
  5398 
  5399 
  5400 
  5401 
  5402 
  5403 
  5404 
  5405 
  5406 
  5407 
  5408 
  5409 
  5410 
  5411 
  5412 
  5413 
  5414 
  5415 
  5416 
  5417 
  5418 
  5419 
  5420 
  5421 
  5422 
  5423 
  5424 
  5425 
  5426 
  5427 
  5428 
  5429 
  5430 
  5431 
  5432 
  5433 
  5434 
  5435 
  5436 
  5437 
  5438 
  5439 
  5440 
  5441 
  5442 
  5443 
  5444 
  5445 
  5446 
  5447 
  5448 
  5449 
  5450 
  5451 
  5452 
  5453 
  5454 
  5455 
  5456 
  5457 
  5458 
  5459 
  5460 
  5461 
  5462 
  5463 
  5464 
  5465 
  5466 
  5467 
  5468 
  5469 
  5470 
  5471 
  5472 
  5473 
  5474 
  5475 
  5476 
  5477 
  5478 
  5479 
  5480 
  5481 
  5482 
  5483 
  5484 
  5485 
  5486 
  5487 
  5488 
  5489 
  5490 
  5491 
  5492 
  5493 
  5494 
  5495 
  5496 
  5497 
  5498 
  5499 
  5500 
  5501 
  5502 
  5503 
  5504 
  5505 
  5506 
  5507 
  5508 
  5509 
  5510 
  5511 
  5512 
  5513 
  5514 
  5515 
  5516 
  5517 
  5518 
  5519 
  5520 
  5521 
  5522 
  5523 
  5524 
  5525 
  5526 
  5527 
  5528 
  5529 
  5530 
  5531 
  5532 
  5533 
  5534 
  5535 
  5536 
  5537 
  5538 
  5539 
  5540 
  5541 
  5542 
  5543 
  5544 
  5545 
  5546 
  5547 
  5548 
  5549 
  5550 
  5551 
  5552 
  5553 
  5554 
  5555 
  5556 
  5557 
  5558 
  5559 
  5560 
  5561 
  5562 
  5563 
  5564 
  5565 
  5566 
  5567 
  5568 
  5569 
  5570 
  5571 
  5572 
  5573 
  5574 
  5575 
  5576 
  5577 
  5578 
  5579 
  5580 
  5581 
  5582 
  5583 
  5584 
  5585 
  5586 
  5587 
  5588 
  5589 
  5590 
  5591 
  5592 
  5593 
  5594 
  5595 
  5596 
  5597 
  5598 
  5599 
  5600 
  5601 
  5602 
  5603 
  5604 
  5605 
  5606 
  5607 
  5608 
  5609 
  5610 
  5611 
  5612 
  5613 
  5614 
  5615 
  5616 
  5617 
  5618 
  5619 
  5620 
  5621 
  5622 
  5623 
  5624 
  5625 
  5626 
  5627 
  5628 
  5629 
  5630 
  5631 
  5632 
  5633 
  5634 
  5635 
  5636 
  5637 
  5638 
  5639 
  5640 
  5641 
  5642 
  5643 
  5644 
  5645 
  5646 
  5647 
  5648 
  5649 
  5650 
  5651 
  5652 
  5653 
  5654 
  5655 
  5656 
  5657 
  5658 
  5659 
  5660 
  5661 
  5662 
  5663 
  5664 
  5665 
  5666 
  5667 
  5668 
  5669 
  5670 
  5671 
  5672 
  5673 
  5674 
  5675 
  5676 
  5677 
  5678 
  5679 
  5680 
  5681 
  5682 
  5683 
  5684 
  5685 
  5686 
  5687 
  5688 
  5689 
  5690 
  5691 
  5692 
  5693 
  5694 
  5695 
  5696 
  5697 
  5698 
  5699 
  5700 
  5701 
  5702 
  5703 
  5704 
  5705 
  5706 
  5707 
  5708 
  5709 
  5710 
  5711 
  5712 
  5713 
  5714 
  5715 
  5716 
  5717 
  5718 
  5719 
  5720 
  5721 
  5722 
  5723 
  5724 
  5725 
  5726 
  5727 
  5728 
  5729 
  5730 
  5731 
  5732 
  5733 
  5734 
  5735 
  5736 
  5737 
  5738 
  5739 
  5740 
  5741 
  5742 
  5743 
  5744 
  5745 
  5746 
  5747 
  5748 
  5749 
  5750 
  5751 
  5752 
  5753 
  5754 
  5755 
  5756 
  5757 
  5758 
  5759 
  5760 
  5761 
  5762 
  5763 
  5764 
  5765 
  5766 
  5767 
  5768 
  5769 
  5770 
  5771 
  5772 
  5773 
  5774 
  5775 
  5776 
  5777 
  5778 
  5779 
  5780 
  5781 
  5782 
  5783 
  5784 
  5785 
  5786 
  5787 
  5788 
  5789 
  5790 
  5791 
  5792 
  5793 
  5794 
  5795 
  5796 
  5797 
  5798 
  5799 
  5800 
  5801 
  5802 
  5803 
  5804 
  5805 
  5806 
  5807 
  5808 
  5809 
  5810 
  5811 
  5812 
  5813 
  5814 
  5815 
  5816 
  5817 
  5818 
  5819 
  5820 
  5821 
  5822 
  5823 
  5824 
  5825 
  5826 
  5827 
  5828 
  5829 
  5830 
  5831 
  5832 
  5833 
  5834 
  5835 
  5836 
  5837 
  5838 
  5839 
  5840 
  5841 
  5842 
  5843 
  5844 
  5845 
  5846 
  5847 
  5848 
  5849 
  5850 
  5851 
  5852 
  5853 
  5854 
  5855 
  5856 
  5857 
  5858 
  5859 
  5860 
  5861 
  5862 
  5863 
  5864 
  5865 
  5866 
  5867 
  5868 
  5869 
  5870 
  5871 
  5872 
  5873 
  5874 
  5875 
  5876 
  5877 
  5878 
  5879 
  5880 
  5881 
  5882 
  5883 
  5884 
  5885 
  5886 
  5887 
  5888 
  5889 
  5890 
  5891 
  5892 
  5893 
  5894 
  5895 
  5896 
  5897 
  5898 
  5899 
  5900 
  5901 
  5902 
  5903 
  5904 
  5905 
  5906 
  5907 
  5908 
  5909 
  5910 
  5911 
  5912 
  5913 
  5914 
  5915 
  5916 
  5917 
  5918 
  5919 
  5920 
  5921 
  5922 
  5923 
  5924 
  5925 
  5926 
  5927 
  5928 
  5929 
  5930 
  5931 
  5932 
  5933 
  5934 
  5935 
  5936 
  5937 
  5938 
  5939 
  5940 
  5941 
  5942 
  5943 
  5944 
  5945 
  5946 
  5947 
  5948 
  5949 
  5950 
  5951 
  5952 
  5953 
  5954 
  5955 
  5956 
  5957 
  5958 
  5959 
  5960 
  5961 
  5962 
  5963 
  5964 
  5965 
  5966 
  5967 
  5968 
  5969 
  5970 
  5971 
  5972 
  5973 
  5974 
  5975 
  5976 
  5977 
  5978 
  5979 
  5980 
  5981 
  5982 
  5983 
  5984 
  5985 
  5986 
  5987 
  5988 
  5989 
  5990 
  5991 
  5992 
  5993 
  5994 
  5995 
  5996 
  5997 
  5998 
  5999 
  6000 
  6001 
  6002 
  6003 
  6004 
  6005 
  6006 
  6007 
  6008 
  6009 
  6010 
  6011 
  6012 
  6013 
  6014 
  6015 
  6016 
  6017 
  6018 
  6019 
  6020 
  6021 
  6022 
  6023 
  6024 
  6025 
  6026 
  6027 
  6028 
  6029 
  6030 
  6031 
  6032 
  6033 
  6034 
  6035 
  6036 
  6037 
  6038 
  6039 
  6040 
  6041 
  6042 
  6043 
  6044 
  6045 
  6046 
  6047 
  6048 
  6049 
  6050 
  6051 
  6052 
  6053 
  6054 
  6055 
  6056 
  6057 
  6058 
  6059 
  6060 
  6061 
  6062 
  6063 
  6064 
  6065 
  6066 
  6067 
  6068 
  6069 
  6070 
  6071 
  6072 
  6073 
  6074 
  6075 
  6076 
  6077 
  6078 
  6079 
  6080 
  6081 
  6082 
  6083 
  6084 
  6085 
  6086 
  6087 
  6088 
  6089 
  6090 
  6091 
  6092 
  6093 
  6094 
  6095 
  6096 
  6097 
  6098 
  6099 
  6100 
  6101 
  6102 
  6103 
  6104 
  6105 
  6106 
  6107 
  6108 
  6109 
  6110 
  6111 
  6112 
  6113 
  6114 
  6115 
  6116 
  6117 
  6118 
  6119 
  6120 
  6121 
  6122 
  6123 
  6124 
  6125 
  6126 
  6127 
  6128 
  6129 
  6130 
  6131 
  6132 
  6133 
  6134 
  6135 
  6136 
  6137 
  6138 
  6139 
  6140 
  6141 
  6142 
  6143 
  6144 
  6145 
  6146 
  6147 
  6148 
  6149 
  6150 
  6151 
  6152 
  6153 
  6154 
  6155 
  6156 
  6157 
  6158 
  6159 
  6160 
  6161 
  6162 
  6163 
  6164 
  6165 
  6166 
  6167 
  6168 
  6169 
  6170 
  6171 
  6172 
  6173 
  6174 
  6175 
  6176 
  6177 
  6178 
  6179 
  6180 
  6181 
  6182 
  6183 
  6184 
  6185 
  6186 
  6187 
  6188 
  6189 
  6190 
  6191 
  6192 
  6193 
  6194 
  6195 
  6196 
  6197 
  6198 
  6199 
  6200 
  6201 
  6202 
  6203 
  6204 
  6205 
  6206 
  6207 
  6208 
  6209 
  6210 
  6211 
  6212 
  6213 
  6214 
  6215 
  6216 
  6217 
  6218 
  6219 
  6220 
  6221 
  6222 
  6223 
  6224 
  6225 
  6226 
  6227 
  6228 
  6229 
  6230 
  6231 
  6232 
  6233 
  6234 
  6235 
  6236 
  6237 
  6238 
  6239 
  6240 
  6241 
  6242 
  6243 
  6244 
  6245 
  6246 
  6247 
  6248 
  6249 
  6250 
  6251 
  6252 
  6253 
  6254 
  6255 
  6256 
  6257 
  6258 
  6259 
  6260 
  6261 
  6262 
  6263 
  6264 
  6265 
  6266 
  6267 
  6268 
  6269 
  6270 
  6271 
  6272 
  6273 
  6274 
  6275 
  6276 
  6277 
  6278 
  6279 
  6280 
  6281 
  6282 
  6283 
  6284 
  6285 
  6286 
  6287 
  6288 
  6289 
  6290 
  6291 
  6292 
  6293 
  6294 
  6295 
  6296 
  6297 
  6298 
  6299 
  6300 
  6301 
  6302 
  6303 
  6304 
  6305 
  6306 
  6307 
  6308 
  6309 
  6310 
  6311 
  6312 
  6313 
  6314 
  6315 
  6316 
  6317 
  6318 
  6319 
  6320 
  6321 
  6322 
  6323 
  6324 
  6325 
  6326 
  6327 
  6328 
  6329 
  6330 
  6331 
  6332 
  6333 
  6334 
  6335 
  6336 
  6337 
  6338 
  6339 
  6340 
  6341 
  6342 
  6343 
  6344 
  6345 
  6346 
  6347 
  6348 
  6349 
  6350 
  6351 
  6352 
  6353 
  6354 
  6355 
  6356 
  6357 
  6358 
  6359 
  6360 
  6361 
  6362 
  6363 
  6364 
  6365 
  6366 
  6367 
  6368 
  6369 
  6370 
  6371 
  6372 
  6373 
  6374 
  6375 
  6376 
  6377 
  6378 
  6379 
  6380 
  6381 
  6382 
  6383 
  6384 
  6385 
  6386 
  6387 
  6388 
  6389 
  6390 
  6391 
  6392 
  6393 
  6394 
  6395 
  6396 
  6397 
  6398 
  6399 
  6400 
  6401 
  6402 
  6403 
  6404 
  6405 
  6406 
  6407 
  6408 
  6409 
  6410 
  6411 
  6412 
  6413 
  6414 
  6415 
  6416 
  6417 
  6418 
  6419 
  6420 
  6421 
  6422 
  6423 
  6424 
  6425 
  6426 
  6427 
  6428 
  6429 
  6430 
  6431 
  6432 
  6433 
  6434 
  6435 
  6436 
  6437 
  6438 
  6439 
  6440 
  6441 
  6442 
  6443 
  6444 
  6445 
  6446 
  6447 
  6448 
  6449 
  6450 
  6451 
  6452 
  6453 
  6454 
  6455 
  6456 
  6457 
  6458 
  6459 
  6460 
  6461 
  6462 
  6463 
  6464 
  6465 
  6466 
  6467 
  6468 
  6469 
  6470 
  6471 
  6472 
  6473 
  6474 
  6475 
  6476 
  6477 
  6478 
  6479 
  6480 
  6481 
  6482 
  6483 
  6484 
  6485 
  6486 
  6487 
  6488 
  6489 
  6490 
  6491 
  6492 
  6493 
  6494 
  6495 
  6496 
  6497 
  6498 
  6499 
  6500 
  6501 
  6502 
  6503 
  6504 
  6505 
  6506 
  6507 
  6508 
  6509 
  6510 
  6511 
  6512 
  6513 
  6514 
  6515 
  6516 
  6517 
  6518 
  6519 
  6520 
  6521 
  6522 
  6523 
  6524 
  6525 
  6526 
  6527 
  6528 
  6529 
  6530 
  6531 
  6532 
  6533 
  6534 
  6535 
  6536 
  6537 
  6538 
  6539 
  6540 
  6541 
  6542 
  6543 
  6544 
  6545 
  6546 
  6547 
  6548 
  6549 
  6550 
  6551 
  6552 
  6553 
  6554 
  6555 
  6556 
  6557 
  6558 
  6559 
  6560 
  6561 
  6562 
  6563 
  6564 
  6565 
  6566 
  6567 
  6568 
  6569 
  6570 
  6571 
  6572 
  6573 
  6574 
  6575 
  6576 
  6577 
  6578 
  6579 
  6580 
  6581 
  6582 
  6583 
  6584 
  6585 
  6586 
  6587 
  6588 
  6589 
  6590 
  6591 
  6592 
  6593 
  6594 
  6595 
  6596 
  6597 
  6598 
  6599 
  6600 
  6601 
  6602 
  6603 
  6604 
  6605 
  6606 
  6607 
  6608 
  6609 
  6610 
  6611 
  6612 
  6613 
  6614 
  6615 
  6616 
  6617 
  6618 
  6619 
  6620 
  6621 
  6622 
  6623 
  6624 
  6625 
  6626 
  6627 
  6628 
  6629 
  6630 
  6631 
  6632 
  6633 
  6634 
  6635 
  6636 
  6637 
  6638 
  6639 
  6640 
  6641 
  6642 
  6643 
  6644 
  6645 
  6646 
  6647 
  6648 
  6649 
  6650 
  6651 
  6652 
  6653 
  6654 
  6655 
  6656 
  6657 
  6658 
  6659 
  6660 
  6661 
  6662 
  6663 
  6664 
  6665 
  6666 
  6667 
  6668 
  6669 
  6670 
  6671 
  6672 
  6673 
  6674 
  6675 
  6676 
  6677 
  6678 
  6679 
  6680 
  6681 
  6682 
  6683 
  6684 
  6685 
  6686 
  6687 
  6688 
  6689 
  6690 
  6691 
  6692 
  6693 
  6694 
  6695 
  6696 
  6697 
  6698 
  6699 
  6700 
  6701 
  6702 
  6703 
  6704 
  6705 
  6706 
  6707 
  6708 
  6709 
  6710 
  6711 
  6712 
  6713 
  6714 
  6715 
  6716 
  6717 
  6718 
  6719 
  6720 
  6721 
  6722 
  6723 
  6724 
  6725 
  6726 
  6727 
  6728 
  6729 
  6730 
  6731 
  6732 
  6733 
  6734 
  6735 
  6736 
  6737 
  6738 
  6739 
  6740 
  6741 
  6742 
  6743 
  6744 
  6745 
  6746 
  6747 
  6748 
  6749 
  6750 
  6751 
  6752 
  6753 
  6754 
  6755 
  6756 
  6757 
  6758 
  6759 
  6760 
  6761 
  6762 
  6763 
  6764 
  6765 
  6766 
  6767 
  6768 
  6769 
  6770 
  6771 
  6772 
  6773 
  6774 
  6775 
  6776 
  6777 
  6778 
  6779 
  6780 
  6781 
  6782 
  6783 
  6784 
  6785 
  6786 
  6787 
  6788 
  6789 
  6790 
  6791 
  6792 
  6793 
  6794 
  6795 
  6796 
  6797 
  6798 
  6799 
  6800 
  6801 
  6802 
  6803 
  6804 
  6805 
  6806 
  6807 
  6808 
  6809 
  6810 
  6811 
  6812 
  6813 
  6814 
  6815 
  6816 
  6817 
  6818 
  6819 
  6820 
  6821 
  6822 
  6823 
  6824 
  6825 
  6826 
  6827 
  6828 
  6829 
  6830 
  6831 
  6832 
  6833 
  6834 
  6835 
  6836 
  6837 
  6838 
  6839 
  6840 
  6841 
  6842 
  6843 
  6844 
  6845 
  6846 
  6847 
  6848 
  6849 
  6850 
  6851 
  6852 
  6853 
  6854 
  6855 
  6856 
  6857 
  6858 
  6859 
  6860 
  6861 
  6862 
  6863 
  6864 
  6865 
  6866 
  6867 
  6868 
  6869 
  6870 
  6871 
  6872 
  6873 
  6874 
  6875 
  6876 
  6877 
  6878 
  6879 
  6880 
  6881 
  6882 
  6883 
  6884 
  6885 
  6886 
  6887 
  6888 
  6889 
  6890 
  6891 
  6892 
  6893 
  6894 
  6895 
  6896 
  6897 
  6898 
  6899 
  6900 
  6901 
  6902 
  6903 
  6904 
  6905 
  6906 
  6907 
  6908 
  6909 
  6910 
  6911 
  6912 
  6913 
  6914 
  6915 
  6916 
  6917 
  6918 
  6919 
  6920 
  6921 
  6922 
  6923 
  6924 
  6925 
  6926 
  6927 
  6928 
  6929 
  6930 
  6931 
  6932 
  6933 
  6934 
  6935 
  6936 
  6937 
  6938 
  6939 
  6940 
  6941 
  6942 
  6943 
  6944 
  6945 
  6946 
  6947 
  6948 
  6949 
  6950 
  6951 
  6952 
  6953 
  6954 
  6955 
  6956 
  6957 
  6958 
  6959 
  6960 
  6961 
  6962 
  6963 
  6964 
  6965 
  6966 
  6967 
  6968 
  6969 
  6970 
  6971 
  6972 
  6973 
  6974 
  6975 
  6976 
  6977 
  6978 
  6979 
  6980 
  6981 
  6982 
  6983 
  6984 
  6985 
  6986 
  6987 
  6988 
  6989 
  6990 
  6991 
  6992 
  6993 
  6994 
  6995 
  6996 
  6997 
  6998 
  6999 
  7000 
  7001 
  7002 
  7003 
  7004 
  7005 
  7006 
  7007 
  7008 
  7009 
  7010 
  7011 
  7012 
  7013 
  7014 
  7015 
  7016 
  7017 
  7018 
  7019 
  7020 
  7021 
  7022 
  7023 
  7024 
  7025 
  7026 
  7027 
  7028 
  7029 
  7030 
  7031 
  7032 
  7033 
  7034 
  7035 
  7036 
  7037 
  7038 
  7039 
  7040 
  7041 
  7042 
  7043 
  7044 
  7045 
  7046 
  7047 
  7048 
  7049 
  7050 
  7051 
  7052 
  7053 
  7054 
  7055 
  7056 
  7057 
  7058 
  7059 
  7060 
  7061 
  7062 
  7063 
  7064 
  7065 
  7066 
  7067 
  7068 
  7069 
  7070 
  7071 
  7072 
  7073 
  7074 
  7075 
  7076 
  7077 
  7078 
  7079 
  7080 
  7081 
  7082 
  7083 
  7084 
  7085 
  7086 
  7087 
  7088 
  7089 
  7090 
  7091 
  7092 
  7093 
  7094 
  7095 
  7096 
  7097 
  7098 
  7099 
  7100 
  7101 
  7102 
  7103 
  7104 
  7105 
  7106 
  7107 
  7108 
  7109 
  7110 
  7111 
  7112 
  7113 
  7114 
  7115 
  7116 
  7117 
  7118 
  7119 
  7120 
  7121 
  7122 
  7123 
  7124 
  7125 
  7126 
  7127 
  7128 
  7129 
  7130 
  7131 
  7132 
  7133 
  7134 
  7135 
  7136 
  7137 
  7138 
  7139 
  7140 
  7141 
  7142 
  7143 
  7144 
  7145 
  7146 
  7147 
  7148 
  7149 
  7150 
  7151 
  7152 
  7153 
  7154 
  7155 
  7156 
  7157 
  7158 
  7159 
  7160 
  7161 
  7162 
  7163 
  7164 
  7165 
  7166 
  7167 
  7168 
  7169 
  7170 
  7171 
  7172 
  7173 
  7174 
  7175 
  7176 
  7177 
  7178 
  7179 
  7180 
  7181 
  7182 
  7183 
  7184 
  7185 
  7186 
  7187 
  7188 
  7189 
  7190 
  7191 
  7192 
  7193 
  7194 
  7195 
  7196 
  7197 
  7198 
  7199 
  7200 
  7201 
  7202 
  7203 
  7204 
  7205 
  7206 
  7207 
  7208 
  7209 
  7210 
  7211 
  7212 
  7213 
  7214 
  7215 
  7216 
  7217 
  7218 
  7219 
  7220 
  7221 
  7222 
  7223 
  7224 
  7225 
  7226 
  7227 
  7228 
  7229 
  7230 
  7231 
  7232 
  7233 
  7234 
  7235 
  7236 
  7237 
  7238 
  7239 
  7240 
  7241 
  7242 
  7243 
  7244 
  7245 
  7246 
  7247 
  7248 
  7249 
  7250 
  7251 
  7252 
  7253 
  7254 
  7255 
  7256 
  7257 
  7258 
  7259 
  7260 
  7261 
  7262 
  7263 
  7264 
  7265 
  7266 
  7267 
  7268 
  7269 
  7270 
  7271 
  7272 
  7273 
  7274 
  7275 
  7276 
  7277 
  7278 
  7279 
  7280 
  7281 
  7282 
  7283 
  7284 
  7285 
  7286 
  7287 
  7288 
  7289 
  7290 
  7291 
  7292 
  7293 
  7294 
  7295 
  7296 
  7297 
  7298 
  7299 
  7300 
  7301 
  7302 
  7303 
  7304 
  7305 
  7306 
  7307 
  7308 
  7309 
  7310 
  7311 
  7312 
  7313 
  7314 
  7315 
  7316 
  7317 
  7318 
  7319 
  7320 
  7321 
  7322 
  7323 
  7324 
  7325 
  7326 
  7327 
  7328 
  7329 
  7330 
  7331 
  7332 
  7333 
  7334 
  7335 
  7336 
  7337 
  7338 
  7339 
  7340 
  7341 
  7342 
  7343 
  7344 
  7345 
  7346 
  7347 
  7348 
  7349 
  7350 
  7351 
  7352 
  7353 
  7354 
  7355 
  7356 
  7357 
  7358 
  7359 
  7360 
  7361 
  7362 
  7363 
  7364 
  7365 
  7366 
  7367 
  7368 
  7369 
  7370 
  7371 
  7372 
  7373 
  7374 
  7375 
  7376 
  7377 
  7378 
  7379 
  7380 
  7381 
  7382 
  7383 
  7384 
  7385 
  7386 
  7387 
  7388 
  7389 
  7390 
  7391 
  7392 
  7393 
  7394 
  7395 
  7396 
  7397 
  7398 
  7399 
  7400 
  7401 
  7402 
  7403 
  7404 
  7405 
  7406 
  7407 
  7408 
  7409 
  7410 
  7411 
  7412 
  7413 
  7414 
  7415 
  7416 
  7417 
  7418 
  7419 
  7420 
  7421 
  7422 
  7423 
  7424 
  7425 
  7426 
  7427 
  7428 
  7429 
  7430 
  7431 
  7432 
  7433 
  7434 
  7435 
  7436 
  7437 
  7438 
  7439 
  7440 
  7441 
  7442 
  7443 
  7444 
  7445 
  7446 
  7447 
  7448 
  7449 
  7450 
  7451 
  7452 
  7453 
  7454 
  7455 
  7456 
  7457 
  7458 
  7459 
  7460 
  7461 
  7462 
  7463 
  7464 
  7465 
  7466 
  7467 
  7468 
  7469 
  7470 
  7471 
  7472 
  7473 
  7474 
  7475 
  7476 
  7477 
  7478 
  7479 
  7480 
  7481 
  7482 
  7483 
  7484 
  7485 
  7486 
  7487 
  7488 
  7489 
  7490 
  7491 
  7492 
  7493 
  7494 
  7495 
  7496 
  7497 
  7498 
  7499 
  7500 
  7501 
  7502 
  7503 
  7504 
  7505 
  7506 
  7507 
  7508 
  7509 
  7510 
  7511 
  7512 
  7513 
  7514 
  7515 
  7516 
  7517 
  7518 
  7519 
  7520 
  7521 
  7522 
  7523 
  7524 
  7525 
  7526 
  7527 
  7528 
  7529 
  7530 
  7531 
  7532 
  7533 
  7534 
  7535 
  7536 
  7537 
  7538 
  7539 
  7540 
  7541 
  7542 
  7543 
  7544 
  7545 
  7546 
  7547 
  7548 
  7549 
  7550 
  7551 
  7552 
  7553 
  7554 
  7555 
  7556 
  7557 
  7558 
  7559 
  7560 
  7561 
  7562 
  7563 
  7564 
  7565 
  7566 
  7567 
  7568 
  7569 
  7570 
  7571 
  7572 
  7573 
  7574 
  7575 
  7576 
  7577 
  7578 
  7579 
  7580 
  7581 
  7582 
  7583 
  7584 
  7585 
  7586 
  7587 
  7588 
  7589 
  7590 
  7591 
  7592 
  7593 
  7594 
  7595 
  7596 
  7597 
  7598 
  7599 
  7600 
  7601 
  7602 
  7603 
  7604 
  7605 
  7606 
  7607 
  7608 
  7609 
  7610 
  7611 
  7612 
  7613 
  7614 
  7615 
  7616 
  7617 
  7618 
  7619 
  7620 
  7621 
  7622 
  7623 
  7624 
  7625 
  7626 
  7627 
  7628 
  7629 
  7630 
  7631 
  7632 
  7633 
  7634 
  7635 
  7636 
  7637 
  7638 
  7639 
  7640 
  7641 
  7642 
  7643 
  7644 
  7645 
  7646 
  7647 
  7648 
  7649 
  7650 
  7651 
  7652 
  7653 
  7654 
  7655 
  7656 
  7657 
  7658 
  7659 
  7660 
  7661 
  7662 
  7663 
  7664 
  7665 
  7666 
  7667 
  7668 
  7669 
  7670 
  7671 
  7672 
  7673 
  7674 
  7675 
  7676 
  7677 
  7678 
  7679 
  7680 
  7681 
  7682 
  7683 
  7684 
  7685 
  7686 
  7687 
  7688 
  7689 
  7690 
  7691 
  7692 
  7693 
  7694 
  7695 
  7696 
  7697 
  7698 
  7699 
  7700 
  7701 
  7702 
  7703 
  7704 
  7705 
  7706 
  7707 
  7708 
  7709 
  7710 
  7711 
  7712 
  7713 
  7714 
  7715 
  7716 
  7717 
  7718 
  7719 
  7720 
  7721 
  7722 
  7723 
  7724 
  7725 
  7726 
  7727 
  7728 
  7729 
  7730 
  7731 
  7732 
  7733 
  7734 
  7735 
  7736 
  7737 
  7738 
  7739 
  7740 
  7741 
  7742 
  7743 
  7744 
  7745 
  7746 
  7747 
  7748 
  7749 
  7750 
  7751 
  7752 
  7753 
  7754 
  7755 
  7756 
  7757 
  7758 
  7759 
  7760 
  7761 
  7762 
  7763 
  7764 
  7765 
  7766 
  7767 
  7768 
  7769 
  7770 
  7771 
  7772 
  7773 
  7774 
  7775 
  7776 
  7777 
  7778 
  7779 
  7780 
  7781 
  7782 
  7783 
  7784 
  7785 
  7786 
  7787 
  7788 
  7789 
  7790 
  7791 
  7792 
  7793 
  7794 
  7795 
  7796 
  7797 
  7798 
  7799 
  7800 
  7801 
  7802 
  7803 
  7804 
  7805 
  7806 
  7807 
  7808 
  7809 
  7810 
  7811 
  7812 
  7813 
  7814 
  7815 
  7816 
  7817 
  7818 
  7819 
  7820 
  7821 
  7822 
  7823 
  7824 
  7825 
  7826 
  7827 
  7828 
  7829 
  7830 
  7831 
  7832 
  7833 
  7834 
  7835 
  7836 
  7837 
  7838 
  7839 
  7840 
  7841 
  7842 
  7843 
  7844 
  7845 
  7846 
  7847 
  7848 
  7849 
  7850 
  7851 
  7852 
  7853 
  7854 
  7855 
  7856 
  7857 
  7858 
  7859 
  7860 
  7861 
  7862 
  7863 
  7864 
  7865 
  7866 
  7867 
  7868 
  7869 
  7870 
  7871 
  7872 
  7873 
  7874 
  7875 
  7876 
  7877 
  7878 
  7879 
  7880 
  7881 
  7882 
  7883 
  7884 
  7885 
  7886 
  7887 
  7888 
  7889 
  7890 
  7891 
  7892 
  7893 
  7894 
  7895 
  7896 
  7897 
  7898 
  7899 
  7900 
  7901 
  7902 
  7903 
  7904 
  7905 
  7906 
  7907 
  7908 
  7909 
  7910 
  7911 
  7912 
  7913 
  7914 
  7915 
  7916 
  7917 
  7918 
  7919 
  7920 
  7921 
  7922 
  7923 
  7924 
  7925 
  7926 
  7927 
  7928 
  7929 
  7930 
  7931 
  7932 
  7933 
  7934 
  7935 
  7936 
  7937 
  7938 
  7939 
  7940 
  7941 
  7942 
  7943 
  7944 
  7945 
  7946 
  7947 
  7948 
  7949 
  7950 
  7951 
  7952 
  7953 
  7954 
  7955 
  7956 
  7957 
  7958 
  7959 
  7960 
  7961 
  7962 
  7963 
  7964 
  7965 
  7966 
  7967 
  7968 
  7969 
  7970 
  7971 
  7972 
  7973 
  7974 
  7975 
  7976 
  7977 
  7978 
  7979 
  7980 
  7981 
  7982 
  7983 
  7984 
  7985 
  7986 
  7987 
  7988 
  7989 
  7990 
  7991 
  7992 
  7993 
  7994 
  7995 
  7996 
  7997 
  7998 
  7999 
  8000 
  8001 
  8002 
  8003 
  8004 
  8005 
  8006 
  8007 
  8008 
  8009 
  8010 
  8011 
  8012 
  8013 
  8014 
  8015 
  8016 
  8017 
  8018 
  8019 
  8020 
  8021 
  8022 
  8023 
  8024 
  8025 
  8026 
  8027 
  8028 
  8029 
  8030 
  8031 
  8032 
  8033 
  8034 
  8035 
  8036 
  8037 
  8038 
  8039 
  8040 
  8041 
  8042 
  8043 
  8044 
  8045 
  8046 
  8047 
  8048 
  8049 
  8050 
  8051 
  8052 
  8053 
  8054 
  8055 
  8056 
  8057 
  8058 
  8059 
  8060 
  8061 
  8062 
  8063 
  8064 
  8065 
  8066 
  8067 
  8068 
  8069 
  8070 
  8071 
  8072 
  8073 
  8074 
  8075 
  8076 
  8077 
  8078 
  8079 
  8080 
  8081 
  8082 
  8083 
  8084 
  8085 
  8086 
  8087 
  8088 
  8089 
  8090 
  8091 
  8092 
  8093 
  8094 
  8095 
  8096 
  8097 
  8098 
  8099 
  8100 
  8101 
  8102 
  8103 
  8104 
  8105 
  8106 
  8107 
  8108 
  8109 
  8110 
  8111 
  8112 
  8113 
  8114 
  8115 
  8116 
  8117 
  8118 
  8119 
  8120 
  8121 
  8122 
  8123 
  8124 
  8125 
  8126 
  8127 
  8128 
  8129 
  8130 
  8131 
  8132 
  8133 
  8134 
  8135 
  8136 
  8137 
  8138 
  8139 
  8140 
  8141 
  8142 
  8143 
  8144 
  8145 
  8146 
  8147 
  8148 
  8149 
  8150 
  8151 
  8152 
  8153 
  8154 
  8155 
  8156 
  8157 
  8158 
  8159 
  8160 
  8161 
  8162 
  8163 
  8164 
  8165 
  8166 
  8167 
  8168 
  8169 
  8170 
  8171 
  8172 
  8173 
  8174 
  8175 
  8176 
  8177 
  8178 
  8179 
  8180 
  8181 
  8182 
  8183 
  8184 
  8185 
  8186 
  8187 
  8188 
  8189 
  8190 
  8191 
  8192 
  8193 
  8194 
  8195 
  8196 
  8197 
  8198 
  8199 
  8200 
  8201 
  8202 
  8203 
  8204 
  8205 
  8206 
  8207 
  8208 
  8209 
  8210 
  8211 
  8212 
  8213 
  8214 
  8215 
  8216 
  8217 
  8218 
  8219 
  8220 
  8221 
  8222 
  8223 
  8224 
  8225 
  8226 
  8227 
  8228 
  8229 
  8230 
  8231 
  8232 
  8233 
  8234 
  8235 
  8236 
  8237 
  8238 
  8239 
  8240 
  8241 
  8242 
  8243 
  8244 
  8245 
  8246 
  8247 
  8248 
  8249 
  8250 
  8251 
  8252 
  8253 
  8254 
  8255 
  8256 
  8257 
  8258 
  8259 
  8260 
  8261 
  8262 
  8263 
  8264 
  8265 
  8266 
  8267 
  8268 
  8269 
  8270 
  8271 
  8272 
  8273 
  8274 
  8275 
  8276 
  8277 
  8278 
  8279 
  8280 
  8281 
  8282 
  8283 
  8284 
  8285 
  8286 
  8287 
  8288 
  8289 
  8290 
  8291 
  8292 
  8293 
  8294 
  8295 
  8296 
  8297 
  8298 
  8299 
  8300 
  8301 
  8302 
  8303 
  8304 
  8305 
  8306 
  8307 
  8308 
  8309 
  8310 
  8311 
  8312 
  8313 
  8314 
  8315 
  8316 
  8317 
  8318 
  8319 
  8320 
  8321 
  8322 
  8323 
  8324 
  8325 
  8326 
  8327 
  8328 
  8329 
  8330 
  8331 
  8332 
  8333 
  8334 
  8335 
  8336 
  8337 
  8338 
  8339 
  8340 
  8341 
  8342 
  8343 
  8344 
  8345 
  8346 
  8347 
  8348 
  8349 
  8350 
  8351 
  8352 
  8353 
  8354 
  8355 
  8356 
  8357 
  8358 
  8359 
  8360 
  8361 
  8362 
  8363 
  8364 
  8365 
  8366 
  8367 
  8368 
  8369 
  8370 
  8371 
  8372 
  8373 
  8374 
  8375 
  8376 
  8377 
  8378 
  8379 
  8380 
  8381 
  8382 
  8383 
  8384 
  8385 
  8386 
  8387 
  8388 
  8389 
  8390 
  8391 
  8392 
  8393 
  8394 
  8395 
  8396 
  8397 
  8398 
  8399 
  8400 
  8401 
  8402 
  8403 
  8404 
  8405 
  8406 
  8407 
  8408 
  8409 
  8410 
  8411 
  8412 
  8413 
  8414 
  8415 
  8416 
  8417 
  8418 
  8419 
  8420 
  8421 
  8422 
  8423 
  8424 
  8425 
  8426 
  8427 
  8428 
  8429 
  8430 
  8431 
  8432 
  8433 
  8434 
  8435 
  8436 
  8437 
  8438 
  8439 
  8440 
  8441 
  8442 
  8443 
  8444 
  8445 
  8446 
  8447 
  8448 
  8449 
  8450 
  8451 
  8452 
  8453 
  8454 
  8455 
  8456 
  8457 
  8458 
  8459 
  8460 
  8461 
  8462 
  8463 
  8464 
  8465 
  8466 
  8467 
  8468 
  8469 
  8470 
  8471 
  8472 
  8473 
  8474 
  8475 
  8476 
  8477 
  8478 
  8479 
  8480 
  8481 
  8482 
  8483 
  8484 
  8485 
  8486 
  8487 
  8488 
  8489 
  8490 
  8491 
  8492 
  8493 
  8494 
  8495 
  8496 
  8497 
  8498 
  8499 
  8500 
  8501 
  8502 
  8503 
  8504 
  8505 
  8506 
  8507 
  8508 
  8509 
  8510 
  8511 
  8512 
  8513 
  8514 
  8515 
  8516 
  8517 
  8518 
  8519 
  8520 
  8521 
  8522 
  8523 
  8524 
  8525 
  8526 
  8527 
  8528 
  8529 
  8530 
  8531 
  8532 
  8533 
  8534 
  8535 
  8536 
  8537 
  8538 
  8539 
  8540 
  8541 
  8542 
  8543 
  8544 
  8545 
  8546 
  8547 
  8548 
  8549 
  8550 
  8551 
  8552 
  8553 
  8554 
  8555 
  8556 
  8557 
  8558 
  8559 
/*
 *  linux/drivers/message/fusion/mptbase.c
 *      This is the Fusion MPT base driver which supports multiple
 *      (SCSI + LAN) specialized protocol drivers.
 *      For use with LSI PCI chip/adapter(s)
 *      running LSI Fusion MPT (Message Passing Technology) firmware.
 *
 *  Copyright (c) 1999-2008 LSI Corporation
 *  (mailto:DL-MPTFusionLinux@lsi.com)
 *
 */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/*
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    NO WARRANTY
    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
    solely responsible for determining the appropriateness of using and
    distributing the Program and assumes all risks associated with its
    exercise of rights under this Agreement, including but not limited to
    the risks and costs of program errors, damage to or loss of data,
    programs or equipment, and unavailability or interruption of operations.

    DISCLAIMER OF LIABILITY
    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/kdev_t.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/interrupt.h>		/* needed for in_interrupt() proto */
#include <linux/dma-mapping.h>
#include <linux/kthread.h>
#include <scsi/scsi_host.h>

#include "mptbase.h"
#include "lsi/mpi_log_fc.h"

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#define my_NAME		"Fusion MPT base driver"
#define my_VERSION	MPT_LINUX_VERSION_COMMON
#define MYNAM		"mptbase"

MODULE_AUTHOR(MODULEAUTHOR);
MODULE_DESCRIPTION(my_NAME);
MODULE_LICENSE("GPL");
MODULE_VERSION(my_VERSION);

/*
 *  cmd line parameters
 */

static int mpt_msi_enable_spi;
module_param(mpt_msi_enable_spi, int, 0);
MODULE_PARM_DESC(mpt_msi_enable_spi,
		 " Enable MSI Support for SPI controllers (default=0)");

static int mpt_msi_enable_fc;
module_param(mpt_msi_enable_fc, int, 0);
MODULE_PARM_DESC(mpt_msi_enable_fc,
		 " Enable MSI Support for FC controllers (default=0)");

static int mpt_msi_enable_sas;
module_param(mpt_msi_enable_sas, int, 0);
MODULE_PARM_DESC(mpt_msi_enable_sas,
		 " Enable MSI Support for SAS controllers (default=0)");

static int mpt_channel_mapping;
module_param(mpt_channel_mapping, int, 0);
MODULE_PARM_DESC(mpt_channel_mapping, " Mapping id's to channels (default=0)");

static int mpt_debug_level;
static int mpt_set_debug_level(const char *val, struct kernel_param *kp);
module_param_call(mpt_debug_level, mpt_set_debug_level, param_get_int,
		  &mpt_debug_level, 0600);
MODULE_PARM_DESC(mpt_debug_level,
		 " debug level - refer to mptdebug.h - (default=0)");

int mpt_fwfault_debug;
EXPORT_SYMBOL(mpt_fwfault_debug);
module_param(mpt_fwfault_debug, int, 0600);
MODULE_PARM_DESC(mpt_fwfault_debug,
		 "Enable detection of Firmware fault and halt Firmware on fault - (default=0)");

static char	MptCallbacksName[MPT_MAX_PROTOCOL_DRIVERS]
				[MPT_MAX_CALLBACKNAME_LEN+1];

#ifdef MFCNT
static int mfcounter = 0;
#define PRINT_MF_COUNT 20000
#endif

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/*
 *  Public data...
 */

#define WHOINIT_UNKNOWN		0xAA

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/*
 *  Private data...
 */
					/* Adapter link list */
LIST_HEAD(ioc_list);
					/* Callback lookup table */
static MPT_CALLBACK		 MptCallbacks[MPT_MAX_PROTOCOL_DRIVERS];
					/* Protocol driver class lookup table */
static int			 MptDriverClass[MPT_MAX_PROTOCOL_DRIVERS];
					/* Event handler lookup table */
static MPT_EVHANDLER		 MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS];
					/* Reset handler lookup table */
static MPT_RESETHANDLER		 MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS];
static struct mpt_pci_driver 	*MptDeviceDriverHandlers[MPT_MAX_PROTOCOL_DRIVERS];

#ifdef CONFIG_PROC_FS
static struct proc_dir_entry 	*mpt_proc_root_dir;
#endif

/*
 *  Driver Callback Index's
 */
static u8 mpt_base_index = MPT_MAX_PROTOCOL_DRIVERS;
static u8 last_drv_idx;

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/*
 *  Forward protos...
 */
static irqreturn_t mpt_interrupt(int irq, void *bus_id);
static int	mptbase_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
		MPT_FRAME_HDR *reply);
static int	mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes,
			u32 *req, int replyBytes, u16 *u16reply, int maxwait,
			int sleepFlag);
static int	mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag);
static void	mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev);
static void	mpt_adapter_disable(MPT_ADAPTER *ioc);
static void	mpt_adapter_dispose(MPT_ADAPTER *ioc);

static void	MptDisplayIocCapabilities(MPT_ADAPTER *ioc);
static int	MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag);
static int	GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason);
static int	GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag);
static int	SendIocInit(MPT_ADAPTER *ioc, int sleepFlag);
static int	SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag);
static int	mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag);
static int	mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag);
static int	mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag);
static int	KickStart(MPT_ADAPTER *ioc, int ignore, int sleepFlag);
static int	SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag);
static int	PrimeIocFifos(MPT_ADAPTER *ioc);
static int	WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag);
static int	WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag);
static int	WaitForDoorbellReply(MPT_ADAPTER *ioc, int howlong, int sleepFlag);
static int	GetLanConfigPages(MPT_ADAPTER *ioc);
static int	GetIoUnitPage2(MPT_ADAPTER *ioc);
int		mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
static int	mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum);
static int	mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum);
static void 	mpt_read_ioc_pg_1(MPT_ADAPTER *ioc);
static void 	mpt_read_ioc_pg_4(MPT_ADAPTER *ioc);
static void	mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc);
static int	SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch,
	int sleepFlag);
static int	SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp);
static int	mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag);
static int	mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init);

#ifdef CONFIG_PROC_FS
static const struct file_operations mpt_summary_proc_fops;
static const struct file_operations mpt_version_proc_fops;
static const struct file_operations mpt_iocinfo_proc_fops;
#endif
static void	mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc);

static int	ProcessEventNotification(MPT_ADAPTER *ioc,
		EventNotificationReply_t *evReply, int *evHandlers);
static void	mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
static void	mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
static void	mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info);
static void	mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info , u8 cb_idx);
static int	mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
static void	mpt_inactive_raid_list_free(MPT_ADAPTER *ioc);

/* module entry point */
static int  __init    fusion_init  (void);
static void __exit    fusion_exit  (void);

#define CHIPREG_READ32(addr) 		readl_relaxed(addr)
#define CHIPREG_READ32_dmasync(addr)	readl(addr)
#define CHIPREG_WRITE32(addr,val) 	writel(val, addr)
#define CHIPREG_PIO_WRITE32(addr,val)	outl(val, (unsigned long)addr)
#define CHIPREG_PIO_READ32(addr) 	inl((unsigned long)addr)

static void
pci_disable_io_access(struct pci_dev *pdev)
{
	u16 command_reg;

	pci_read_config_word(pdev, PCI_COMMAND, &command_reg);
	command_reg &= ~1;
	pci_write_config_word(pdev, PCI_COMMAND, command_reg);
}

static void
pci_enable_io_access(struct pci_dev *pdev)
{
	u16 command_reg;

	pci_read_config_word(pdev, PCI_COMMAND, &command_reg);
	command_reg |= 1;
	pci_write_config_word(pdev, PCI_COMMAND, command_reg);
}

static int mpt_set_debug_level(const char *val, struct kernel_param *kp)
{
	int ret = param_set_int(val, kp);
	MPT_ADAPTER *ioc;

	if (ret)
		return ret;

	list_for_each_entry(ioc, &ioc_list, list)
		ioc->debug_level = mpt_debug_level;
	return 0;
}

/**
 *	mpt_get_cb_idx - obtain cb_idx for registered driver
 *	@dclass: class driver enum
 *
 *	Returns cb_idx, or zero means it wasn't found
 **/
static u8
mpt_get_cb_idx(MPT_DRIVER_CLASS dclass)
{
	u8 cb_idx;

	for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--)
		if (MptDriverClass[cb_idx] == dclass)
			return cb_idx;
	return 0;
}

/**
 * mpt_is_discovery_complete - determine if discovery has completed
 * @ioc: per adatper instance
 *
 * Returns 1 when discovery completed, else zero.
 */
static int
mpt_is_discovery_complete(MPT_ADAPTER *ioc)
{
	ConfigExtendedPageHeader_t hdr;
	CONFIGPARMS cfg;
	SasIOUnitPage0_t *buffer;
	dma_addr_t dma_handle;
	int rc = 0;

	memset(&hdr, 0, sizeof(ConfigExtendedPageHeader_t));
	memset(&cfg, 0, sizeof(CONFIGPARMS));
	hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
	cfg.cfghdr.ehdr = &hdr;
	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;

	if ((mpt_config(ioc, &cfg)))
		goto out;
	if (!hdr.ExtPageLength)
		goto out;

	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
	    &dma_handle);
	if (!buffer)
		goto out;

	cfg.physAddr = dma_handle;
	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;

	if ((mpt_config(ioc, &cfg)))
		goto out_free_consistent;

	if (!(buffer->PhyData[0].PortFlags &
	    MPI_SAS_IOUNIT0_PORT_FLAGS_DISCOVERY_IN_PROGRESS))
		rc = 1;

 out_free_consistent:
	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
	    buffer, dma_handle);
 out:
	return rc;
}


/**
 *  mpt_remove_dead_ioc_func - kthread context to remove dead ioc
 * @arg: input argument, used to derive ioc
 *
 * Return 0 if controller is removed from pci subsystem.
 * Return -1 for other case.
 */
static int mpt_remove_dead_ioc_func(void *arg)
{
	MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
	struct pci_dev *pdev;

	if ((ioc == NULL))
		return -1;

	pdev = ioc->pcidev;
	if ((pdev == NULL))
		return -1;

	pci_stop_and_remove_bus_device_locked(pdev);
	return 0;
}



/**
 *	mpt_fault_reset_work - work performed on workq after ioc fault
 *	@work: input argument, used to derive ioc
 *
**/
static void
mpt_fault_reset_work(struct work_struct *work)
{
	MPT_ADAPTER	*ioc =
	    container_of(work, MPT_ADAPTER, fault_reset_work.work);
	u32		 ioc_raw_state;
	int		 rc;
	unsigned long	 flags;
	MPT_SCSI_HOST	*hd;
	struct task_struct *p;

	if (ioc->ioc_reset_in_progress || !ioc->active)
		goto out;


	ioc_raw_state = mpt_GetIocState(ioc, 0);
	if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_MASK) {
		printk(MYIOC_s_INFO_FMT "%s: IOC is non-operational !!!!\n",
		    ioc->name, __func__);

		/*
		 * Call mptscsih_flush_pending_cmds callback so that we
		 * flush all pending commands back to OS.
		 * This call is required to aovid deadlock at block layer.
		 * Dead IOC will fail to do diag reset,and this call is safe
		 * since dead ioc will never return any command back from HW.
		 */
		hd = shost_priv(ioc->sh);
		ioc->schedule_dead_ioc_flush_running_cmds(hd);

		/*Remove the Dead Host */
		p = kthread_run(mpt_remove_dead_ioc_func, ioc,
				"mpt_dead_ioc_%d", ioc->id);
		if (IS_ERR(p))	{
			printk(MYIOC_s_ERR_FMT
				"%s: Running mpt_dead_ioc thread failed !\n",
				ioc->name, __func__);
		} else {
			printk(MYIOC_s_WARN_FMT
				"%s: Running mpt_dead_ioc thread success !\n",
				ioc->name, __func__);
		}
		return; /* don't rearm timer */
	}

	if ((ioc_raw_state & MPI_IOC_STATE_MASK)
			== MPI_IOC_STATE_FAULT) {
		printk(MYIOC_s_WARN_FMT "IOC is in FAULT state (%04xh)!!!\n",
		       ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK);
		printk(MYIOC_s_WARN_FMT "Issuing HardReset from %s!!\n",
		       ioc->name, __func__);
		rc = mpt_HardResetHandler(ioc, CAN_SLEEP);
		printk(MYIOC_s_WARN_FMT "%s: HardReset: %s\n", ioc->name,
		       __func__, (rc == 0) ? "success" : "failed");
		ioc_raw_state = mpt_GetIocState(ioc, 0);
		if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT)
			printk(MYIOC_s_WARN_FMT "IOC is in FAULT state after "
			    "reset (%04xh)\n", ioc->name, ioc_raw_state &
			    MPI_DOORBELL_DATA_MASK);
	} else if (ioc->bus_type == SAS && ioc->sas_discovery_quiesce_io) {
		if ((mpt_is_discovery_complete(ioc))) {
			devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "clearing "
			    "discovery_quiesce_io flag\n", ioc->name));
			ioc->sas_discovery_quiesce_io = 0;
		}
	}

 out:
	/*
	 * Take turns polling alternate controller
	 */
	if (ioc->alt_ioc)
		ioc = ioc->alt_ioc;

	/* rearm the timer */
	spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
	if (ioc->reset_work_q)
		queue_delayed_work(ioc->reset_work_q, &ioc->fault_reset_work,
			msecs_to_jiffies(MPT_POLLING_INTERVAL));
	spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
}


/*
 *  Process turbo (context) reply...
 */
static void
mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)
{
	MPT_FRAME_HDR *mf = NULL;
	MPT_FRAME_HDR *mr = NULL;
	u16 req_idx = 0;
	u8 cb_idx;

	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got TURBO reply req_idx=%08x\n",
				ioc->name, pa));

	switch (pa >> MPI_CONTEXT_REPLY_TYPE_SHIFT) {
	case MPI_CONTEXT_REPLY_TYPE_SCSI_INIT:
		req_idx = pa & 0x0000FFFF;
		cb_idx = (pa & 0x00FF0000) >> 16;
		mf = MPT_INDEX_2_MFPTR(ioc, req_idx);
		break;
	case MPI_CONTEXT_REPLY_TYPE_LAN:
		cb_idx = mpt_get_cb_idx(MPTLAN_DRIVER);
		/*
		 *  Blind set of mf to NULL here was fatal
		 *  after lan_reply says "freeme"
		 *  Fix sort of combined with an optimization here;
		 *  added explicit check for case where lan_reply
		 *  was just returning 1 and doing nothing else.
		 *  For this case skip the callback, but set up
		 *  proper mf value first here:-)
		 */
		if ((pa & 0x58000000) == 0x58000000) {
			req_idx = pa & 0x0000FFFF;
			mf = MPT_INDEX_2_MFPTR(ioc, req_idx);
			mpt_free_msg_frame(ioc, mf);
			mb();
			return;
			break;
		}
		mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);
		break;
	case MPI_CONTEXT_REPLY_TYPE_SCSI_TARGET:
		cb_idx = mpt_get_cb_idx(MPTSTM_DRIVER);
		mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);
		break;
	default:
		cb_idx = 0;
		BUG();
	}

	/*  Check for (valid) IO callback!  */
	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
		MptCallbacks[cb_idx] == NULL) {
		printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n",
				__func__, ioc->name, cb_idx);
		goto out;
	}

	if (MptCallbacks[cb_idx](ioc, mf, mr))
		mpt_free_msg_frame(ioc, mf);
 out:
	mb();
}

static void
mpt_reply(MPT_ADAPTER *ioc, u32 pa)
{
	MPT_FRAME_HDR	*mf;
	MPT_FRAME_HDR	*mr;
	u16		 req_idx;
	u8		 cb_idx;
	int		 freeme;

	u32 reply_dma_low;
	u16 ioc_stat;

	/* non-TURBO reply!  Hmmm, something may be up...
	 *  Newest turbo reply mechanism; get address
	 *  via left shift 1 (get rid of MPI_ADDRESS_REPLY_A_BIT)!
	 */

	/* Map DMA address of reply header to cpu address.
	 * pa is 32 bits - but the dma address may be 32 or 64 bits
	 * get offset based only only the low addresses
	 */

	reply_dma_low = (pa <<= 1);
	mr = (MPT_FRAME_HDR *)((u8 *)ioc->reply_frames +
			 (reply_dma_low - ioc->reply_frames_low_dma));

	req_idx = le16_to_cpu(mr->u.frame.hwhdr.msgctxu.fld.req_idx);
	cb_idx = mr->u.frame.hwhdr.msgctxu.fld.cb_idx;
	mf = MPT_INDEX_2_MFPTR(ioc, req_idx);

	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got non-TURBO reply=%p req_idx=%x cb_idx=%x Function=%x\n",
			ioc->name, mr, req_idx, cb_idx, mr->u.hdr.Function));
	DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mr);

	 /*  Check/log IOC log info
	 */
	ioc_stat = le16_to_cpu(mr->u.reply.IOCStatus);
	if (ioc_stat & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) {
		u32	 log_info = le32_to_cpu(mr->u.reply.IOCLogInfo);
		if (ioc->bus_type == FC)
			mpt_fc_log_info(ioc, log_info);
		else if (ioc->bus_type == SPI)
			mpt_spi_log_info(ioc, log_info);
		else if (ioc->bus_type == SAS)
			mpt_sas_log_info(ioc, log_info, cb_idx);
	}

	if (ioc_stat & MPI_IOCSTATUS_MASK)
		mpt_iocstatus_info(ioc, (u32)ioc_stat, mf);

	/*  Check for (valid) IO callback!  */
	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
		MptCallbacks[cb_idx] == NULL) {
		printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n",
				__func__, ioc->name, cb_idx);
		freeme = 0;
		goto out;
	}

	freeme = MptCallbacks[cb_idx](ioc, mf, mr);

 out:
	/*  Flush (non-TURBO) reply with a WRITE!  */
	CHIPREG_WRITE32(&ioc->chip->ReplyFifo, pa);

	if (freeme)
		mpt_free_msg_frame(ioc, mf);
	mb();
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_interrupt - MPT adapter (IOC) specific interrupt handler.
 *	@irq: irq number (not used)
 *	@bus_id: bus identifier cookie == pointer to MPT_ADAPTER structure
 *
 *	This routine is registered via the request_irq() kernel API call,
 *	and handles all interrupts generated from a specific MPT adapter
 *	(also referred to as a IO Controller or IOC).
 *	This routine must clear the interrupt from the adapter and does
 *	so by reading the reply FIFO.  Multiple replies may be processed
 *	per single call to this routine.
 *
 *	This routine handles register-level access of the adapter but
 *	dispatches (calls) a protocol-specific callback routine to handle
 *	the protocol-specific details of the MPT request completion.
 */
static irqreturn_t
mpt_interrupt(int irq, void *bus_id)
{
	MPT_ADAPTER *ioc = bus_id;
	u32 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo);

	if (pa == 0xFFFFFFFF)
		return IRQ_NONE;

	/*
	 *  Drain the reply FIFO!
	 */
	do {
		if (pa & MPI_ADDRESS_REPLY_A_BIT)
			mpt_reply(ioc, pa);
		else
			mpt_turbo_reply(ioc, pa);
		pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo);
	} while (pa != 0xFFFFFFFF);

	return IRQ_HANDLED;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mptbase_reply - MPT base driver's callback routine
 *	@ioc: Pointer to MPT_ADAPTER structure
 *	@req: Pointer to original MPT request frame
 *	@reply: Pointer to MPT reply frame (NULL if TurboReply)
 *
 *	MPT base driver's callback routine; all base driver
 *	"internal" request/reply processing is routed here.
 *	Currently used for EventNotification and EventAck handling.
 *
 *	Returns 1 indicating original alloc'd request frame ptr
 *	should be freed, or 0 if it shouldn't.
 */
static int
mptbase_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
{
	EventNotificationReply_t *pEventReply;
	u8 event;
	int evHandlers;
	int freereq = 1;

	switch (reply->u.hdr.Function) {
	case MPI_FUNCTION_EVENT_NOTIFICATION:
		pEventReply = (EventNotificationReply_t *)reply;
		evHandlers = 0;
		ProcessEventNotification(ioc, pEventReply, &evHandlers);
		event = le32_to_cpu(pEventReply->Event) & 0xFF;
		if (pEventReply->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY)
			freereq = 0;
		if (event != MPI_EVENT_EVENT_CHANGE)
			break;
	case MPI_FUNCTION_CONFIG:
	case MPI_FUNCTION_SAS_IO_UNIT_CONTROL:
		ioc->mptbase_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
		ioc->mptbase_cmds.status |= MPT_MGMT_STATUS_RF_VALID;
		memcpy(ioc->mptbase_cmds.reply, reply,
		    min(MPT_DEFAULT_FRAME_SIZE,
			4 * reply->u.reply.MsgLength));
		if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_PENDING) {
			ioc->mptbase_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
			complete(&ioc->mptbase_cmds.done);
		} else
			freereq = 0;
		if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_FREE_MF)
			freereq = 1;
		break;
	case MPI_FUNCTION_EVENT_ACK:
		devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
		    "EventAck reply received\n", ioc->name));
		break;
	default:
		printk(MYIOC_s_ERR_FMT
		    "Unexpected msg function (=%02Xh) reply received!\n",
		    ioc->name, reply->u.hdr.Function);
		break;
	}

	/*
	 *	Conditionally tell caller to free the original
	 *	EventNotification/EventAck/unexpected request frame!
	 */
	return freereq;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_register - Register protocol-specific main callback handler.
 *	@cbfunc: callback function pointer
 *	@dclass: Protocol driver's class (%MPT_DRIVER_CLASS enum value)
 *	@func_name: call function's name
 *
 *	This routine is called by a protocol-specific driver (SCSI host,
 *	LAN, SCSI target) to register its reply callback routine.  Each
 *	protocol-specific driver must do this before it will be able to
 *	use any IOC resources, such as obtaining request frames.
 *
 *	NOTES: The SCSI protocol driver currently calls this routine thrice
 *	in order to register separate callbacks; one for "normal" SCSI IO;
 *	one for MptScsiTaskMgmt requests; one for Scan/DV requests.
 *
 *	Returns u8 valued "handle" in the range (and S.O.D. order)
 *	{N,...,7,6,5,...,1} if successful.
 *	A return value of MPT_MAX_PROTOCOL_DRIVERS (including zero!) should be
 *	considered an error by the caller.
 */
u8
mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass, char *func_name)
{
	u8 cb_idx;
	last_drv_idx = MPT_MAX_PROTOCOL_DRIVERS;

	/*
	 *  Search for empty callback slot in this order: {N,...,7,6,5,...,1}
	 *  (slot/handle 0 is reserved!)
	 */
	for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
		if (MptCallbacks[cb_idx] == NULL) {
			MptCallbacks[cb_idx] = cbfunc;
			MptDriverClass[cb_idx] = dclass;
			MptEvHandlers[cb_idx] = NULL;
			last_drv_idx = cb_idx;
			strlcpy(MptCallbacksName[cb_idx], func_name,
				MPT_MAX_CALLBACKNAME_LEN+1);
			break;
		}
	}

	return last_drv_idx;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_deregister - Deregister a protocol drivers resources.
 *	@cb_idx: previously registered callback handle
 *
 *	Each protocol-specific driver should call this routine when its
 *	module is unloaded.
 */
void
mpt_deregister(u8 cb_idx)
{
	if (cb_idx && (cb_idx < MPT_MAX_PROTOCOL_DRIVERS)) {
		MptCallbacks[cb_idx] = NULL;
		MptDriverClass[cb_idx] = MPTUNKNOWN_DRIVER;
		MptEvHandlers[cb_idx] = NULL;

		last_drv_idx++;
	}
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_event_register - Register protocol-specific event callback handler.
 *	@cb_idx: previously registered (via mpt_register) callback handle
 *	@ev_cbfunc: callback function
 *
 *	This routine can be called by one or more protocol-specific drivers
 *	if/when they choose to be notified of MPT events.
 *
 *	Returns 0 for success.
 */
int
mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc)
{
	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
		return -1;

	MptEvHandlers[cb_idx] = ev_cbfunc;
	return 0;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_event_deregister - Deregister protocol-specific event callback handler
 *	@cb_idx: previously registered callback handle
 *
 *	Each protocol-specific driver should call this routine
 *	when it does not (or can no longer) handle events,
 *	or when its module is unloaded.
 */
void
mpt_event_deregister(u8 cb_idx)
{
	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
		return;

	MptEvHandlers[cb_idx] = NULL;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_reset_register - Register protocol-specific IOC reset handler.
 *	@cb_idx: previously registered (via mpt_register) callback handle
 *	@reset_func: reset function
 *
 *	This routine can be called by one or more protocol-specific drivers
 *	if/when they choose to be notified of IOC resets.
 *
 *	Returns 0 for success.
 */
int
mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func)
{
	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
		return -1;

	MptResetHandlers[cb_idx] = reset_func;
	return 0;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_reset_deregister - Deregister protocol-specific IOC reset handler.
 *	@cb_idx: previously registered callback handle
 *
 *	Each protocol-specific driver should call this routine
 *	when it does not (or can no longer) handle IOC reset handling,
 *	or when its module is unloaded.
 */
void
mpt_reset_deregister(u8 cb_idx)
{
	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
		return;

	MptResetHandlers[cb_idx] = NULL;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_device_driver_register - Register device driver hooks
 *	@dd_cbfunc: driver callbacks struct
 *	@cb_idx: MPT protocol driver index
 */
int
mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx)
{
	MPT_ADAPTER	*ioc;
	const struct pci_device_id *id;

	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
		return -EINVAL;

	MptDeviceDriverHandlers[cb_idx] = dd_cbfunc;

	/* call per pci device probe entry point */
	list_for_each_entry(ioc, &ioc_list, list) {
		id = ioc->pcidev->driver ?
		    ioc->pcidev->driver->id_table : NULL;
		if (dd_cbfunc->probe)
			dd_cbfunc->probe(ioc->pcidev, id);
	 }

	return 0;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_device_driver_deregister - DeRegister device driver hooks
 *	@cb_idx: MPT protocol driver index
 */
void
mpt_device_driver_deregister(u8 cb_idx)
{
	struct mpt_pci_driver *dd_cbfunc;
	MPT_ADAPTER	*ioc;

	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
		return;

	dd_cbfunc = MptDeviceDriverHandlers[cb_idx];

	list_for_each_entry(ioc, &ioc_list, list) {
		if (dd_cbfunc->remove)
			dd_cbfunc->remove(ioc->pcidev);
	}

	MptDeviceDriverHandlers[cb_idx] = NULL;
}


/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_get_msg_frame - Obtain an MPT request frame from the pool
 *	@cb_idx: Handle of registered MPT protocol driver
 *	@ioc: Pointer to MPT adapter structure
 *
 *	Obtain an MPT request frame from the pool (of 1024) that are
 *	allocated per MPT adapter.
 *
 *	Returns pointer to a MPT request frame or %NULL if none are available
 *	or IOC is not active.
 */
MPT_FRAME_HDR*
mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc)
{
	MPT_FRAME_HDR *mf;
	unsigned long flags;
	u16	 req_idx;	/* Request index */

	/* validate handle and ioc identifier */

#ifdef MFCNT
	if (!ioc->active)
		printk(MYIOC_s_WARN_FMT "IOC Not Active! mpt_get_msg_frame "
		    "returning NULL!\n", ioc->name);
#endif

	/* If interrupts are not attached, do not return a request frame */
	if (!ioc->active)
		return NULL;

	spin_lock_irqsave(&ioc->FreeQlock, flags);
	if (!list_empty(&ioc->FreeQ)) {
		int req_offset;

		mf = list_entry(ioc->FreeQ.next, MPT_FRAME_HDR,
				u.frame.linkage.list);
		list_del(&mf->u.frame.linkage.list);
		mf->u.frame.linkage.arg1 = 0;
		mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;	/* byte */
		req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
								/* u16! */
		req_idx = req_offset / ioc->req_sz;
		mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
		mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0;
		/* Default, will be changed if necessary in SG generation */
		ioc->RequestNB[req_idx] = ioc->NB_for_64_byte_frame;
#ifdef MFCNT
		ioc->mfcnt++;
#endif
	}
	else
		mf = NULL;
	spin_unlock_irqrestore(&ioc->FreeQlock, flags);

#ifdef MFCNT
	if (mf == NULL)
		printk(MYIOC_s_WARN_FMT "IOC Active. No free Msg Frames! "
		    "Count 0x%x Max 0x%x\n", ioc->name, ioc->mfcnt,
		    ioc->req_depth);
	mfcounter++;
	if (mfcounter == PRINT_MF_COUNT)
		printk(MYIOC_s_INFO_FMT "MF Count 0x%x Max 0x%x \n", ioc->name,
		    ioc->mfcnt, ioc->req_depth);
#endif

	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_get_msg_frame(%d,%d), got mf=%p\n",
	    ioc->name, cb_idx, ioc->id, mf));
	return mf;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_put_msg_frame - Send a protocol-specific MPT request frame to an IOC
 *	@cb_idx: Handle of registered MPT protocol driver
 *	@ioc: Pointer to MPT adapter structure
 *	@mf: Pointer to MPT request frame
 *
 *	This routine posts an MPT request frame to the request post FIFO of a
 *	specific MPT adapter.
 */
void
mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
{
	u32 mf_dma_addr;
	int req_offset;
	u16	 req_idx;	/* Request index */

	/* ensure values are reset properly! */
	mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;		/* byte */
	req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
								/* u16! */
	req_idx = req_offset / ioc->req_sz;
	mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
	mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0;

	DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf);

	mf_dma_addr = (ioc->req_frames_low_dma + req_offset) | ioc->RequestNB[req_idx];
	dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d "
	    "RequestNB=%x\n", ioc->name, mf_dma_addr, req_idx,
	    ioc->RequestNB[req_idx]));
	CHIPREG_WRITE32(&ioc->chip->RequestFifo, mf_dma_addr);
}

/**
 *	mpt_put_msg_frame_hi_pri - Send a hi-pri protocol-specific MPT request frame
 *	@cb_idx: Handle of registered MPT protocol driver
 *	@ioc: Pointer to MPT adapter structure
 *	@mf: Pointer to MPT request frame
 *
 *	Send a protocol-specific MPT request frame to an IOC using
 *	hi-priority request queue.
 *
 *	This routine posts an MPT request frame to the request post FIFO of a
 *	specific MPT adapter.
 **/
void
mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
{
	u32 mf_dma_addr;
	int req_offset;
	u16	 req_idx;	/* Request index */

	/* ensure values are reset properly! */
	mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;
	req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
	req_idx = req_offset / ioc->req_sz;
	mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
	mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0;

	DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf);

	mf_dma_addr = (ioc->req_frames_low_dma + req_offset);
	dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d\n",
		ioc->name, mf_dma_addr, req_idx));
	CHIPREG_WRITE32(&ioc->chip->RequestHiPriFifo, mf_dma_addr);
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_free_msg_frame - Place MPT request frame back on FreeQ.
 *	@ioc: Pointer to MPT adapter structure
 *	@mf: Pointer to MPT request frame
 *
 *	This routine places a MPT request frame back on the MPT adapter's
 *	FreeQ.
 */
void
mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
{
	unsigned long flags;

	/*  Put Request back on FreeQ!  */
	spin_lock_irqsave(&ioc->FreeQlock, flags);
	if (cpu_to_le32(mf->u.frame.linkage.arg1) == 0xdeadbeaf)
		goto out;
	/* signature to know if this mf is freed */
	mf->u.frame.linkage.arg1 = cpu_to_le32(0xdeadbeaf);
	list_add(&mf->u.frame.linkage.list, &ioc->FreeQ);
#ifdef MFCNT
	ioc->mfcnt--;
#endif
 out:
	spin_unlock_irqrestore(&ioc->FreeQlock, flags);
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_add_sge - Place a simple 32 bit SGE at address pAddr.
 *	@pAddr: virtual address for SGE
 *	@flagslength: SGE flags and data transfer length
 *	@dma_addr: Physical address
 *
 *	This routine places a MPT request frame back on the MPT adapter's
 *	FreeQ.
 */
static void
mpt_add_sge(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
{
	SGESimple32_t *pSge = (SGESimple32_t *) pAddr;
	pSge->FlagsLength = cpu_to_le32(flagslength);
	pSge->Address = cpu_to_le32(dma_addr);
}

/**
 *	mpt_add_sge_64bit - Place a simple 64 bit SGE at address pAddr.
 *	@pAddr: virtual address for SGE
 *	@flagslength: SGE flags and data transfer length
 *	@dma_addr: Physical address
 *
 *	This routine places a MPT request frame back on the MPT adapter's
 *	FreeQ.
 **/
static void
mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
{
	SGESimple64_t *pSge = (SGESimple64_t *) pAddr;
	pSge->Address.Low = cpu_to_le32
			(lower_32_bits(dma_addr));
	pSge->Address.High = cpu_to_le32
			(upper_32_bits(dma_addr));
	pSge->FlagsLength = cpu_to_le32
			((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING));
}

/**
 *	mpt_add_sge_64bit_1078 - Place a simple 64 bit SGE at address pAddr (1078 workaround).
 *	@pAddr: virtual address for SGE
 *	@flagslength: SGE flags and data transfer length
 *	@dma_addr: Physical address
 *
 *	This routine places a MPT request frame back on the MPT adapter's
 *	FreeQ.
 **/
static void
mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
{
	SGESimple64_t *pSge = (SGESimple64_t *) pAddr;
	u32 tmp;

	pSge->Address.Low = cpu_to_le32
			(lower_32_bits(dma_addr));
	tmp = (u32)(upper_32_bits(dma_addr));

	/*
	 * 1078 errata workaround for the 36GB limitation
	 */
	if ((((u64)dma_addr + MPI_SGE_LENGTH(flagslength)) >> 32)  == 9) {
		flagslength |=
		    MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_LOCAL_ADDRESS);
		tmp |= (1<<31);
		if (mpt_debug_level & MPT_DEBUG_36GB_MEM)
			printk(KERN_DEBUG "1078 P0M2 addressing for "
			    "addr = 0x%llx len = %d\n",
			    (unsigned long long)dma_addr,
			    MPI_SGE_LENGTH(flagslength));
	}

	pSge->Address.High = cpu_to_le32(tmp);
	pSge->FlagsLength = cpu_to_le32(
		(flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING));
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_add_chain - Place a 32 bit chain SGE at address pAddr.
 *	@pAddr: virtual address for SGE
 *	@next: nextChainOffset value (u32's)
 *	@length: length of next SGL segment
 *	@dma_addr: Physical address
 *
 */
static void
mpt_add_chain(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr)
{
		SGEChain32_t *pChain = (SGEChain32_t *) pAddr;
		pChain->Length = cpu_to_le16(length);
		pChain->Flags = MPI_SGE_FLAGS_CHAIN_ELEMENT;
		pChain->NextChainOffset = next;
		pChain->Address = cpu_to_le32(dma_addr);
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_add_chain_64bit - Place a 64 bit chain SGE at address pAddr.
 *	@pAddr: virtual address for SGE
 *	@next: nextChainOffset value (u32's)
 *	@length: length of next SGL segment
 *	@dma_addr: Physical address
 *
 */
static void
mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr)
{
		SGEChain64_t *pChain = (SGEChain64_t *) pAddr;
		u32 tmp = dma_addr & 0xFFFFFFFF;

		pChain->Length = cpu_to_le16(length);
		pChain->Flags = (MPI_SGE_FLAGS_CHAIN_ELEMENT |
				 MPI_SGE_FLAGS_64_BIT_ADDRESSING);

		pChain->NextChainOffset = next;

		pChain->Address.Low = cpu_to_le32(tmp);
		tmp = (u32)(upper_32_bits(dma_addr));
		pChain->Address.High = cpu_to_le32(tmp);
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_send_handshake_request - Send MPT request via doorbell handshake method.
 *	@cb_idx: Handle of registered MPT protocol driver
 *	@ioc: Pointer to MPT adapter structure
 *	@reqBytes: Size of the request in bytes
 *	@req: Pointer to MPT request frame
 *	@sleepFlag: Use schedule if CAN_SLEEP else use udelay.
 *
 *	This routine is used exclusively to send MptScsiTaskMgmt
 *	requests since they are required to be sent via doorbell handshake.
 *
 *	NOTE: It is the callers responsibility to byte-swap fields in the
 *	request which are greater than 1 byte in size.
 *
 *	Returns 0 for success, non-zero for failure.
 */
int
mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)
{
	int	r = 0;
	u8	*req_as_bytes;
	int	 ii;

	/* State is known to be good upon entering
	 * this function so issue the bus reset
	 * request.
	 */

	/*
	 * Emulate what mpt_put_msg_frame() does /wrt to sanity
	 * setting cb_idx/req_idx.  But ONLY if this request
	 * is in proper (pre-alloc'd) request buffer range...
	 */
	ii = MFPTR_2_MPT_INDEX(ioc,(MPT_FRAME_HDR*)req);
	if (reqBytes >= 12 && ii >= 0 && ii < ioc->req_depth) {
		MPT_FRAME_HDR *mf = (MPT_FRAME_HDR*)req;
		mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(ii);
		mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;
	}

	/* Make sure there are no doorbells */
	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);

	CHIPREG_WRITE32(&ioc->chip->Doorbell,
			((MPI_FUNCTION_HANDSHAKE<<MPI_DOORBELL_FUNCTION_SHIFT) |
			 ((reqBytes/4)<<MPI_DOORBELL_ADD_DWORDS_SHIFT)));

	/* Wait for IOC doorbell int */
	if ((ii = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0) {
		return ii;
	}

	/* Read doorbell and check for active bit */
	if (!(CHIPREG_READ32(&ioc->chip->Doorbell) & MPI_DOORBELL_ACTIVE))
		return -5;

	dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_send_handshake_request start, WaitCnt=%d\n",
		ioc->name, ii));

	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);

	if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) {
		return -2;
	}

	/* Send request via doorbell handshake */
	req_as_bytes = (u8 *) req;
	for (ii = 0; ii < reqBytes/4; ii++) {
		u32 word;

		word = ((req_as_bytes[(ii*4) + 0] <<  0) |
			(req_as_bytes[(ii*4) + 1] <<  8) |
			(req_as_bytes[(ii*4) + 2] << 16) |
			(req_as_bytes[(ii*4) + 3] << 24));
		CHIPREG_WRITE32(&ioc->chip->Doorbell, word);
		if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) {
			r = -3;
			break;
		}
	}

	if (r >= 0 && WaitForDoorbellInt(ioc, 10, sleepFlag) >= 0)
		r = 0;
	else
		r = -4;

	/* Make sure there are no doorbells */
	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);

	return r;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 * mpt_host_page_access_control - control the IOC's Host Page Buffer access
 * @ioc: Pointer to MPT adapter structure
 * @access_control_value: define bits below
 * @sleepFlag: Specifies whether the process can sleep
 *
 * Provides mechanism for the host driver to control the IOC's
 * Host Page Buffer access.
 *
 * Access Control Value - bits[15:12]
 * 0h Reserved
 * 1h Enable Access { MPI_DB_HPBAC_ENABLE_ACCESS }
 * 2h Disable Access { MPI_DB_HPBAC_DISABLE_ACCESS }
 * 3h Free Buffer { MPI_DB_HPBAC_FREE_BUFFER }
 *
 * Returns 0 for success, non-zero for failure.
 */

static int
mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag)
{
	int	 r = 0;

	/* return if in use */
	if (CHIPREG_READ32(&ioc->chip->Doorbell)
	    & MPI_DOORBELL_ACTIVE)
	    return -1;

	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);

	CHIPREG_WRITE32(&ioc->chip->Doorbell,
		((MPI_FUNCTION_HOST_PAGEBUF_ACCESS_CONTROL
		 <<MPI_DOORBELL_FUNCTION_SHIFT) |
		 (access_control_value<<12)));

	/* Wait for IOC to clear Doorbell Status bit */
	if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) {
		return -2;
	}else
		return 0;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_host_page_alloc - allocate system memory for the fw
 *	@ioc: Pointer to pointer to IOC adapter
 *	@ioc_init: Pointer to ioc init config page
 *
 *	If we already allocated memory in past, then resend the same pointer.
 *	Returns 0 for success, non-zero for failure.
 */
static int
mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init)
{
	char	*psge;
	int	flags_length;
	u32	host_page_buffer_sz=0;

	if(!ioc->HostPageBuffer) {

		host_page_buffer_sz =
		    le32_to_cpu(ioc->facts.HostPageBufferSGE.FlagsLength) & 0xFFFFFF;

		if(!host_page_buffer_sz)
			return 0; /* fw doesn't need any host buffers */

		/* spin till we get enough memory */
		while(host_page_buffer_sz > 0) {

			if((ioc->HostPageBuffer = pci_alloc_consistent(
			    ioc->pcidev,
			    host_page_buffer_sz,
			    &ioc->HostPageBuffer_dma)) != NULL) {

				dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
				    "host_page_buffer @ %p, dma @ %x, sz=%d bytes\n",
				    ioc->name, ioc->HostPageBuffer,
				    (u32)ioc->HostPageBuffer_dma,
				    host_page_buffer_sz));
				ioc->alloc_total += host_page_buffer_sz;
				ioc->HostPageBuffer_sz = host_page_buffer_sz;
				break;
			}

			host_page_buffer_sz -= (4*1024);
		}
	}

	if(!ioc->HostPageBuffer) {
		printk(MYIOC_s_ERR_FMT
		    "Failed to alloc memory for host_page_buffer!\n",
		    ioc->name);
		return -999;
	}

	psge = (char *)&ioc_init->HostPageBufferSGE;
	flags_length = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
	    MPI_SGE_FLAGS_SYSTEM_ADDRESS |
	    MPI_SGE_FLAGS_HOST_TO_IOC |
	    MPI_SGE_FLAGS_END_OF_BUFFER;
	flags_length = flags_length << MPI_SGE_FLAGS_SHIFT;
	flags_length |= ioc->HostPageBuffer_sz;
	ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma);
	ioc->facts.HostPageBufferSGE = ioc_init->HostPageBufferSGE;

return 0;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_verify_adapter - Given IOC identifier, set pointer to its adapter structure.
 *	@iocid: IOC unique identifier (integer)
 *	@iocpp: Pointer to pointer to IOC adapter
 *
 *	Given a unique IOC identifier, set pointer to the associated MPT
 *	adapter structure.
 *
 *	Returns iocid and sets iocpp if iocid is found.
 *	Returns -1 if iocid is not found.
 */
int
mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)
{
	MPT_ADAPTER *ioc;

	list_for_each_entry(ioc,&ioc_list,list) {
		if (ioc->id == iocid) {
			*iocpp =ioc;
			return iocid;
		}
	}

	*iocpp = NULL;
	return -1;
}

/**
 *	mpt_get_product_name - returns product string
 *	@vendor: pci vendor id
 *	@device: pci device id
 *	@revision: pci revision id
 *
 *	Returns product string displayed when driver loads,
 *	in /proc/mpt/summary and /sysfs/class/scsi_host/host<X>/version_product
 *
 **/
static const char*
mpt_get_product_name(u16 vendor, u16 device, u8 revision)
{
	char *product_str = NULL;

	if (vendor == PCI_VENDOR_ID_BROCADE) {
		switch (device)
		{
		case MPI_MANUFACTPAGE_DEVICEID_FC949E:
			switch (revision)
			{
			case 0x00:
				product_str = "BRE040 A0";
				break;
			case 0x01:
				product_str = "BRE040 A1";
				break;
			default:
				product_str = "BRE040";
				break;
			}
			break;
		}
		goto out;
	}

	switch (device)
	{
	case MPI_MANUFACTPAGE_DEVICEID_FC909:
		product_str = "LSIFC909 B1";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC919:
		product_str = "LSIFC919 B0";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC929:
		product_str = "LSIFC929 B0";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC919X:
		if (revision < 0x80)
			product_str = "LSIFC919X A0";
		else
			product_str = "LSIFC919XL A1";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC929X:
		if (revision < 0x80)
			product_str = "LSIFC929X A0";
		else
			product_str = "LSIFC929XL A1";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC939X:
		product_str = "LSIFC939X A1";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC949X:
		product_str = "LSIFC949X A1";
		break;
	case MPI_MANUFACTPAGE_DEVICEID_FC949E:
		switch (revision)
		{
		case 0x00:
			product_str = "LSIFC949E A0";
			break;
		case 0x01:
			product_str = "LSIFC949E A1";
			break;
		default:
			product_str = "LSIFC949E";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_53C1030:
		switch (revision)
		{
		case 0x00:
			product_str = "LSI53C1030 A0";
			break;
		case 0x01:
			product_str = "LSI53C1030 B0";
			break;
		case 0x03:
			product_str = "LSI53C1030 B1";
			break;
		case 0x07:
			product_str = "LSI53C1030 B2";
			break;
		case 0x08:
			product_str = "LSI53C1030 C0";
			break;
		case 0x80:
			product_str = "LSI53C1030T A0";
			break;
		case 0x83:
			product_str = "LSI53C1030T A2";
			break;
		case 0x87:
			product_str = "LSI53C1030T A3";
			break;
		case 0xc1:
			product_str = "LSI53C1020A A1";
			break;
		default:
			product_str = "LSI53C1030";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_1030_53C1035:
		switch (revision)
		{
		case 0x03:
			product_str = "LSI53C1035 A2";
			break;
		case 0x04:
			product_str = "LSI53C1035 B0";
			break;
		default:
			product_str = "LSI53C1035";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_SAS1064:
		switch (revision)
		{
		case 0x00:
			product_str = "LSISAS1064 A1";
			break;
		case 0x01:
			product_str = "LSISAS1064 A2";
			break;
		case 0x02:
			product_str = "LSISAS1064 A3";
			break;
		case 0x03:
			product_str = "LSISAS1064 A4";
			break;
		default:
			product_str = "LSISAS1064";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_SAS1064E:
		switch (revision)
		{
		case 0x00:
			product_str = "LSISAS1064E A0";
			break;
		case 0x01:
			product_str = "LSISAS1064E B0";
			break;
		case 0x02:
			product_str = "LSISAS1064E B1";
			break;
		case 0x04:
			product_str = "LSISAS1064E B2";
			break;
		case 0x08:
			product_str = "LSISAS1064E B3";
			break;
		default:
			product_str = "LSISAS1064E";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_SAS1068:
		switch (revision)
		{
		case 0x00:
			product_str = "LSISAS1068 A0";
			break;
		case 0x01:
			product_str = "LSISAS1068 B0";
			break;
		case 0x02:
			product_str = "LSISAS1068 B1";
			break;
		default:
			product_str = "LSISAS1068";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_SAS1068E:
		switch (revision)
		{
		case 0x00:
			product_str = "LSISAS1068E A0";
			break;
		case 0x01:
			product_str = "LSISAS1068E B0";
			break;
		case 0x02:
			product_str = "LSISAS1068E B1";
			break;
		case 0x04:
			product_str = "LSISAS1068E B2";
			break;
		case 0x08:
			product_str = "LSISAS1068E B3";
			break;
		default:
			product_str = "LSISAS1068E";
			break;
		}
		break;
	case MPI_MANUFACTPAGE_DEVID_SAS1078:
		switch (revision)
		{
		case 0x00:
			product_str = "LSISAS1078 A0";
			break;
		case 0x01:
			product_str = "LSISAS1078 B0";
			break;
		case 0x02:
			product_str = "LSISAS1078 C0";
			break;
		case 0x03:
			product_str = "LSISAS1078 C1";
			break;
		case 0x04:
			product_str = "LSISAS1078 C2";
			break;
		default:
			product_str = "LSISAS1078";
			break;
		}
		break;
	}

 out:
	return product_str;
}

/**
 *	mpt_mapresources - map in memory mapped io
 *	@ioc: Pointer to pointer to IOC adapter
 *
 **/
static int
mpt_mapresources(MPT_ADAPTER *ioc)
{
	u8		__iomem *mem;
	int		 ii;
	resource_size_t	 mem_phys;
	unsigned long	 port;
	u32		 msize;
	u32		 psize;
	int		 r = -ENODEV;
	struct pci_dev *pdev;

	pdev = ioc->pcidev;
	ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM);
	if (pci_enable_device_mem(pdev)) {
		printk(MYIOC_s_ERR_FMT "pci_enable_device_mem() "
		    "failed\n", ioc->name);
		return r;
	}
	if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) {
		printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with "
		    "MEM failed\n", ioc->name);
		goto out_pci_disable_device;
	}

	if (sizeof(dma_addr_t) > 4) {
		const uint64_t required_mask = dma_get_required_mask
		    (&pdev->dev);
		if (required_mask > DMA_BIT_MASK(32)
			&& !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
			&& !pci_set_consistent_dma_mask(pdev,
						 DMA_BIT_MASK(64))) {
			ioc->dma_mask = DMA_BIT_MASK(64);
			dinitprintk(ioc, printk(MYIOC_s_INFO_FMT
				": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n",
				ioc->name));
		} else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
			&& !pci_set_consistent_dma_mask(pdev,
						DMA_BIT_MASK(32))) {
			ioc->dma_mask = DMA_BIT_MASK(32);
			dinitprintk(ioc, printk(MYIOC_s_INFO_FMT
				": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n",
				ioc->name));
		} else {
			printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n",
			    ioc->name, pci_name(pdev));
			goto out_pci_release_region;
		}
	} else {
		if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
			&& !pci_set_consistent_dma_mask(pdev,
						DMA_BIT_MASK(32))) {
			ioc->dma_mask = DMA_BIT_MASK(32);
			dinitprintk(ioc, printk(MYIOC_s_INFO_FMT
				": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n",
				ioc->name));
		} else {
			printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n",
			    ioc->name, pci_name(pdev));
			goto out_pci_release_region;
		}
	}

	mem_phys = msize = 0;
	port = psize = 0;
	for (ii = 0; ii < DEVICE_COUNT_RESOURCE; ii++) {
		if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) {
			if (psize)
				continue;
			/* Get I/O space! */
			port = pci_resource_start(pdev, ii);
			psize = pci_resource_len(pdev, ii);
		} else {
			if (msize)
				continue;
			/* Get memmap */
			mem_phys = pci_resource_start(pdev, ii);
			msize = pci_resource_len(pdev, ii);
		}
	}
	ioc->mem_size = msize;

	mem = NULL;
	/* Get logical ptr for PciMem0 space */
	/*mem = ioremap(mem_phys, msize);*/
	mem = ioremap(mem_phys, msize);
	if (mem == NULL) {
		printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter"
			" memory!\n", ioc->name);
		r = -EINVAL;
		goto out_pci_release_region;
	}
	ioc->memmap = mem;
	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %llx\n",
	    ioc->name, mem, (unsigned long long)mem_phys));

	ioc->mem_phys = mem_phys;
	ioc->chip = (SYSIF_REGS __iomem *)mem;

	/* Save Port IO values in case we need to do downloadboot */
	ioc->pio_mem_phys = port;
	ioc->pio_chip = (SYSIF_REGS __iomem *)port;

	return 0;

out_pci_release_region:
	pci_release_selected_regions(pdev, ioc->bars);
out_pci_disable_device:
	pci_disable_device(pdev);
	return r;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_attach - Install a PCI intelligent MPT adapter.
 *	@pdev: Pointer to pci_dev structure
 *	@id: PCI device ID information
 *
 *	This routine performs all the steps necessary to bring the IOC of
 *	a MPT adapter to a OPERATIONAL state.  This includes registering
 *	memory regions, registering the interrupt, and allocating request
 *	and reply memory pools.
 *
 *	This routine also pre-fetches the LAN MAC address of a Fibre Channel
 *	MPT adapter.
 *
 *	Returns 0 for success, non-zero for failure.
 *
 *	TODO: Add support for polled controllers
 */
int
mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
{
	MPT_ADAPTER	*ioc;
	u8		 cb_idx;
	int		 r = -ENODEV;
	u8		 pcixcmd;
	static int	 mpt_ids = 0;
#ifdef CONFIG_PROC_FS
	struct proc_dir_entry *dent;
#endif

	ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC);
	if (ioc == NULL) {
		printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n");
		return -ENOMEM;
	}

	ioc->id = mpt_ids++;
	sprintf(ioc->name, "ioc%d", ioc->id);
	dinitprintk(ioc, printk(KERN_WARNING MYNAM ": mpt_adapter_install\n"));

	/*
	 * set initial debug level
	 * (refer to mptdebug.h)
	 *
	 */
	ioc->debug_level = mpt_debug_level;
	if (mpt_debug_level)
		printk(KERN_INFO "mpt_debug_level=%xh\n", mpt_debug_level);

	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": mpt_adapter_install\n", ioc->name));

	ioc->pcidev = pdev;
	if (mpt_mapresources(ioc)) {
		goto out_free_ioc;
	}

	/*
	 * Setting up proper handlers for scatter gather handling
	 */
	if (ioc->dma_mask == DMA_BIT_MASK(64)) {
		if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1078)
			ioc->add_sge = &mpt_add_sge_64bit_1078;
		else
			ioc->add_sge = &mpt_add_sge_64bit;
		ioc->add_chain = &mpt_add_chain_64bit;
		ioc->sg_addr_size = 8;
	} else {
		ioc->add_sge = &mpt_add_sge;
		ioc->add_chain = &mpt_add_chain;
		ioc->sg_addr_size = 4;
	}
	ioc->SGE_size = sizeof(u32) + ioc->sg_addr_size;

	ioc->alloc_total = sizeof(MPT_ADAPTER);
	ioc->req_sz = MPT_DEFAULT_FRAME_SIZE;		/* avoid div by zero! */
	ioc->reply_sz = MPT_REPLY_FRAME_SIZE;


	spin_lock_init(&ioc->taskmgmt_lock);
	mutex_init(&ioc->internal_cmds.mutex);
	init_completion(&ioc->internal_cmds.done);
	mutex_init(&ioc->mptbase_cmds.mutex);
	init_completion(&ioc->mptbase_cmds.done);
	mutex_init(&ioc->taskmgmt_cmds.mutex);
	init_completion(&ioc->taskmgmt_cmds.done);

	/* Initialize the event logging.
	 */
	ioc->eventTypes = 0;	/* None */
	ioc->eventContext = 0;
	ioc->eventLogSize = 0;
	ioc->events = NULL;

#ifdef MFCNT
	ioc->mfcnt = 0;
#endif

	ioc->sh = NULL;
	ioc->cached_fw = NULL;

	/* Initialize SCSI Config Data structure
	 */
	memset(&ioc->spi_data, 0, sizeof(SpiCfgData));

	/* Initialize the fc rport list head.
	 */
	INIT_LIST_HEAD(&ioc->fc_rports);

	/* Find lookup slot. */
	INIT_LIST_HEAD(&ioc->list);


	/* Initialize workqueue */
	INIT_DELAYED_WORK(&ioc->fault_reset_work, mpt_fault_reset_work);

	snprintf(ioc->reset_work_q_name, MPT_KOBJ_NAME_LEN,
		 "mpt_poll_%d", ioc->id);
	ioc->reset_work_q = alloc_workqueue(ioc->reset_work_q_name,
					    WQ_MEM_RECLAIM, 0);
	if (!ioc->reset_work_q) {
		printk(MYIOC_s_ERR_FMT "Insufficient memory to add adapter!\n",
		    ioc->name);
		r = -ENOMEM;
		goto out_unmap_resources;
	}

	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n",
	    ioc->name, &ioc->facts, &ioc->pfacts[0]));

	ioc->prod_name = mpt_get_product_name(pdev->vendor, pdev->device,
					      pdev->revision);

	switch (pdev->device)
	{
	case MPI_MANUFACTPAGE_DEVICEID_FC939X:
	case MPI_MANUFACTPAGE_DEVICEID_FC949X:
		ioc->errata_flag_1064 = 1;
	case MPI_MANUFACTPAGE_DEVICEID_FC909:
	case MPI_MANUFACTPAGE_DEVICEID_FC929:
	case MPI_MANUFACTPAGE_DEVICEID_FC919:
	case MPI_MANUFACTPAGE_DEVICEID_FC949E:
		ioc->bus_type = FC;
		break;

	case MPI_MANUFACTPAGE_DEVICEID_FC929X:
		if (pdev->revision < XL_929) {
			/* 929X Chip Fix. Set Split transactions level
		 	* for PCIX. Set MOST bits to zero.
		 	*/
			pci_read_config_byte(pdev, 0x6a, &pcixcmd);
			pcixcmd &= 0x8F;
			pci_write_config_byte(pdev, 0x6a, pcixcmd);
		} else {
			/* 929XL Chip Fix. Set MMRBC to 0x08.
		 	*/
			pci_read_config_byte(pdev, 0x6a, &pcixcmd);
			pcixcmd |= 0x08;
			pci_write_config_byte(pdev, 0x6a, pcixcmd);
		}
		ioc->bus_type = FC;
		break;

	case MPI_MANUFACTPAGE_DEVICEID_FC919X:
		/* 919X Chip Fix. Set Split transactions level
		 * for PCIX. Set MOST bits to zero.
		 */
		pci_read_config_byte(pdev, 0x6a, &pcixcmd);
		pcixcmd &= 0x8F;
		pci_write_config_byte(pdev, 0x6a, pcixcmd);
		ioc->bus_type = FC;
		break;

	case MPI_MANUFACTPAGE_DEVID_53C1030:
		/* 1030 Chip Fix. Disable Split transactions
		 * for PCIX. Set MOST bits to zero if Rev < C0( = 8).
		 */
		if (pdev->revision < C0_1030) {
			pci_read_config_byte(pdev, 0x6a, &pcixcmd);
			pcixcmd &= 0x8F;
			pci_write_config_byte(pdev, 0x6a, pcixcmd);
		}

	case MPI_MANUFACTPAGE_DEVID_1030_53C1035:
		ioc->bus_type = SPI;
		break;

	case MPI_MANUFACTPAGE_DEVID_SAS1064:
	case MPI_MANUFACTPAGE_DEVID_SAS1068:
		ioc->errata_flag_1064 = 1;
		ioc->bus_type = SAS;
		break;

	case MPI_MANUFACTPAGE_DEVID_SAS1064E:
	case MPI_MANUFACTPAGE_DEVID_SAS1068E:
	case MPI_MANUFACTPAGE_DEVID_SAS1078:
		ioc->bus_type = SAS;
		break;
	}


	switch (ioc->bus_type) {

	case SAS:
		ioc->msi_enable = mpt_msi_enable_sas;
		break;

	case SPI:
		ioc->msi_enable = mpt_msi_enable_spi;
		break;

	case FC:
		ioc->msi_enable = mpt_msi_enable_fc;
		break;

	default:
		ioc->msi_enable = 0;
		break;
	}

	ioc->fw_events_off = 1;

	if (ioc->errata_flag_1064)
		pci_disable_io_access(pdev);

	spin_lock_init(&ioc->FreeQlock);

	/* Disable all! */
	CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF);
	ioc->active = 0;
	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);

	/* Set IOC ptr in the pcidev's driver data. */
	pci_set_drvdata(ioc->pcidev, ioc);

	/* Set lookup ptr. */
	list_add_tail(&ioc->list, &ioc_list);

	/* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
	 */
	mpt_detect_bound_ports(ioc, pdev);

	INIT_LIST_HEAD(&ioc->fw_event_list);
	spin_lock_init(&ioc->fw_event_lock);
	snprintf(ioc->fw_event_q_name, MPT_KOBJ_NAME_LEN, "mpt/%d", ioc->id);
	ioc->fw_event_q = alloc_workqueue(ioc->fw_event_q_name,
					  WQ_MEM_RECLAIM, 0);
	if (!ioc->fw_event_q) {
		printk(MYIOC_s_ERR_FMT "Insufficient memory to add adapter!\n",
		    ioc->name);
		r = -ENOMEM;
		goto out_remove_ioc;
	}

	if ((r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP,
	    CAN_SLEEP)) != 0){
		printk(MYIOC_s_ERR_FMT "didn't initialize properly! (%d)\n",
		    ioc->name, r);

		destroy_workqueue(ioc->fw_event_q);
		ioc->fw_event_q = NULL;

		list_del(&ioc->list);
		if (ioc->alt_ioc)
			ioc->alt_ioc->alt_ioc = NULL;
		iounmap(ioc->memmap);
		if (pci_is_enabled(pdev))
			pci_disable_device(pdev);
		if (r != -5)
			pci_release_selected_regions(pdev, ioc->bars);

		destroy_workqueue(ioc->reset_work_q);
		ioc->reset_work_q = NULL;

		kfree(ioc);
		return r;
	}

	/* call per device driver probe entry point */
	for(cb_idx = 0; cb_idx < MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) {
		if(MptDeviceDriverHandlers[cb_idx] &&
		  MptDeviceDriverHandlers[cb_idx]->probe) {
			MptDeviceDriverHandlers[cb_idx]->probe(pdev,id);
		}
	}

#ifdef CONFIG_PROC_FS
	/*
	 *  Create "/proc/mpt/iocN" subdirectory entry for each MPT adapter.
	 */
	dent = proc_mkdir(ioc->name, mpt_proc_root_dir);
	if (dent) {
		proc_create_data("info", S_IRUGO, dent, &mpt_iocinfo_proc_fops, ioc);
		proc_create_data("summary", S_IRUGO, dent, &mpt_summary_proc_fops, ioc);
	}
#endif

	if (!ioc->alt_ioc)
		queue_delayed_work(ioc->reset_work_q, &ioc->fault_reset_work,
			msecs_to_jiffies(MPT_POLLING_INTERVAL));

	return 0;

out_remove_ioc:
	list_del(&ioc->list);
	if (ioc->alt_ioc)
		ioc->alt_ioc->alt_ioc = NULL;

	destroy_workqueue(ioc->reset_work_q);
	ioc->reset_work_q = NULL;

out_unmap_resources:
	iounmap(ioc->memmap);
	pci_disable_device(pdev);
	pci_release_selected_regions(pdev, ioc->bars);

out_free_ioc:
	kfree(ioc);

	return r;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_detach - Remove a PCI intelligent MPT adapter.
 *	@pdev: Pointer to pci_dev structure
 */

void
mpt_detach(struct pci_dev *pdev)
{
	MPT_ADAPTER 	*ioc = pci_get_drvdata(pdev);
	char pname[32];
	u8 cb_idx;
	unsigned long flags;
	struct workqueue_struct *wq;

	/*
	 * Stop polling ioc for fault condition
	 */
	spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
	wq = ioc->reset_work_q;
	ioc->reset_work_q = NULL;
	spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
	cancel_delayed_work(&ioc->fault_reset_work);
	destroy_workqueue(wq);

	spin_lock_irqsave(&ioc->fw_event_lock, flags);
	wq = ioc->fw_event_q;
	ioc->fw_event_q = NULL;
	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
	destroy_workqueue(wq);

	sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/summary", ioc->name);
	remove_proc_entry(pname, NULL);
	sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/info", ioc->name);
	remove_proc_entry(pname, NULL);
	sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s", ioc->name);
	remove_proc_entry(pname, NULL);

	/* call per device driver remove entry point */
	for(cb_idx = 0; cb_idx < MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) {
		if(MptDeviceDriverHandlers[cb_idx] &&
		  MptDeviceDriverHandlers[cb_idx]->remove) {
			MptDeviceDriverHandlers[cb_idx]->remove(pdev);
		}
	}

	/* Disable interrupts! */
	CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF);

	ioc->active = 0;
	synchronize_irq(pdev->irq);

	/* Clear any lingering interrupt */
	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);

	CHIPREG_READ32(&ioc->chip->IntStatus);

	mpt_adapter_dispose(ioc);

}

/**************************************************************************
 * Power Management
 */
#ifdef CONFIG_PM
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
 *	mpt_suspend - Fusion MPT base driver suspend routine.
 *	@pdev: Pointer to pci_dev structure
 *	@state: new state to enter
 */
int
mpt_suspend(struct pci_dev *pdev, pm_message_t state)
{
	u32 device_state;
	MPT_ADAPTER *ioc = pci_get_drvdata(pdev);

	device_state = pci_choose_state(pdev, state);
	printk(MYIOC_s_INFO_FMT "pci-suspend: pdev=0x%p, slot=%s, Entering "
	    "operating state [D%d]\n", ioc->name, pdev, pci_name(pdev),
	    device_state);

	/* put ioc into READY_STATE */
	if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESE