cxgb_t3_hw.c (172100) | cxgb_t3_hw.c (176472) |
---|---|
1/************************************************************************** 2 3Copyright (c) 2007, Chelsio Inc. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 --- 14 unchanged lines hidden (view full) --- 23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26POSSIBILITY OF SUCH DAMAGE. 27 28***************************************************************************/ 29 30#include <sys/cdefs.h> | 1/************************************************************************** 2 3Copyright (c) 2007, Chelsio Inc. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 --- 14 unchanged lines hidden (view full) --- 23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26POSSIBILITY OF SUCH DAMAGE. 27 28***************************************************************************/ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/common/cxgb_t3_hw.c 172100 2007-09-09 03:51:25Z kmacy $"); | 31__FBSDID("$FreeBSD: head/sys/dev/cxgb/common/cxgb_t3_hw.c 176472 2008-02-23 01:06:17Z kmacy $"); |
32 33 34#ifdef CONFIG_DEFINED 35#include <cxgb_include.h> 36#else 37#include <dev/cxgb/cxgb_include.h> 38#endif 39 --- 359 unchanged lines hidden (view full) --- 399 if (advert & ADVERTISED_Pause) 400 val |= ADVERTISE_PAUSE_CAP; 401 if (advert & ADVERTISED_Asym_Pause) 402 val |= ADVERTISE_PAUSE_ASYM; 403 return mdio_write(phy, 0, MII_ADVERTISE, val); 404} 405 406/** | 32 33 34#ifdef CONFIG_DEFINED 35#include <cxgb_include.h> 36#else 37#include <dev/cxgb/cxgb_include.h> 38#endif 39 --- 359 unchanged lines hidden (view full) --- 399 if (advert & ADVERTISED_Pause) 400 val |= ADVERTISE_PAUSE_CAP; 401 if (advert & ADVERTISED_Asym_Pause) 402 val |= ADVERTISE_PAUSE_ASYM; 403 return mdio_write(phy, 0, MII_ADVERTISE, val); 404} 405 406/** |
407 * t3_phy_advertise_fiber - set fiber PHY advertisement register 408 * @phy: the PHY to operate on 409 * @advert: bitmap of capabilities the PHY should advertise 410 * 411 * Sets a fiber PHY's advertisement register to advertise the 412 * requested capabilities. 413 */ 414int t3_phy_advertise_fiber(struct cphy *phy, unsigned int advert) 415{ 416 unsigned int val = 0; 417 418 if (advert & ADVERTISED_1000baseT_Half) 419 val |= ADVERTISE_1000XHALF; 420 if (advert & ADVERTISED_1000baseT_Full) 421 val |= ADVERTISE_1000XFULL; 422 if (advert & ADVERTISED_Pause) 423 val |= ADVERTISE_1000XPAUSE; 424 if (advert & ADVERTISED_Asym_Pause) 425 val |= ADVERTISE_1000XPSE_ASYM; 426 return mdio_write(phy, 0, MII_ADVERTISE, val); 427} 428 429/** |
|
407 * t3_set_phy_speed_duplex - force PHY speed and duplex 408 * @phy: the PHY to operate on 409 * @speed: requested PHY speed 410 * @duplex: requested PHY duplex 411 * 412 * Force a 10/100/1000 PHY's speed and duplex. This also disables 413 * auto-negotiation except for GigE, where auto-negotiation is mandatory. 414 */ --- 31 unchanged lines hidden (view full) --- 446 &mi1_mdio_ops, "Chelsio PE9000" }, 447 { 1, 1, 0, 0, 0, 448 F_GPIO2_OEN | F_GPIO4_OEN | 449 F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5, 450 0, 451 &mi1_mdio_ops, "Chelsio T302" }, 452 { 1, 0, 0, 0, 0, 453 F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | | 430 * t3_set_phy_speed_duplex - force PHY speed and duplex 431 * @phy: the PHY to operate on 432 * @speed: requested PHY speed 433 * @duplex: requested PHY duplex 434 * 435 * Force a 10/100/1000 PHY's speed and duplex. This also disables 436 * auto-negotiation except for GigE, where auto-negotiation is mandatory. 437 */ --- 31 unchanged lines hidden (view full) --- 469 &mi1_mdio_ops, "Chelsio PE9000" }, 470 { 1, 1, 0, 0, 0, 471 F_GPIO2_OEN | F_GPIO4_OEN | 472 F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5, 473 0, 474 &mi1_mdio_ops, "Chelsio T302" }, 475 { 1, 0, 0, 0, 0, 476 F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | |
454 F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, 455 SUPPORTED_10000baseT_Full | SUPPORTED_AUI, | 477 F_GPIO11_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 478 0, SUPPORTED_10000baseT_Full | SUPPORTED_AUI, |
456 &mi1_mdio_ext_ops, "Chelsio T310" }, 457 { 1, 1, 0, 0, 0, 458 F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN | 459 F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL | 460 F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, 461 SUPPORTED_10000baseT_Full | SUPPORTED_AUI, 462 &mi1_mdio_ext_ops, "Chelsio T320" }, 463 { 4, 0, 0, 0, 0, --- 7 unchanged lines hidden (view full) --- 471 * Return the adapter_info structure with a given index. Out-of-range indices 472 * return NULL. 473 */ 474const struct adapter_info *t3_get_adapter_info(unsigned int id) 475{ 476 return id < ARRAY_SIZE(t3_adap_info) ? &t3_adap_info[id] : NULL; 477} 478 | 479 &mi1_mdio_ext_ops, "Chelsio T310" }, 480 { 1, 1, 0, 0, 0, 481 F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN | 482 F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL | 483 F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, 484 SUPPORTED_10000baseT_Full | SUPPORTED_AUI, 485 &mi1_mdio_ext_ops, "Chelsio T320" }, 486 { 4, 0, 0, 0, 0, --- 7 unchanged lines hidden (view full) --- 494 * Return the adapter_info structure with a given index. Out-of-range indices 495 * return NULL. 496 */ 497const struct adapter_info *t3_get_adapter_info(unsigned int id) 498{ 499 return id < ARRAY_SIZE(t3_adap_info) ? &t3_adap_info[id] : NULL; 500} 501 |
479#define CAPS_1G (SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full | \ 480 SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII) 481#define CAPS_10G (SUPPORTED_10000baseT_Full | SUPPORTED_AUI) 482 | |
483static struct port_type_info port_types[] = { 484 { NULL }, | 502static struct port_type_info port_types[] = { 503 { NULL }, |
485 { t3_ael1002_phy_prep, CAPS_10G | SUPPORTED_FIBRE, 486 "10GBASE-XR" }, 487 { t3_vsc8211_phy_prep, CAPS_1G | SUPPORTED_TP | SUPPORTED_IRQ, 488 "10/100/1000BASE-T" }, 489 { t3_mv88e1xxx_phy_prep, CAPS_1G | SUPPORTED_TP | SUPPORTED_IRQ, 490 "10/100/1000BASE-T" }, 491 { t3_xaui_direct_phy_prep, CAPS_10G | SUPPORTED_TP, "10GBASE-CX4" }, 492 { NULL, CAPS_10G, "10GBASE-KX4" }, 493 { t3_qt2045_phy_prep, CAPS_10G | SUPPORTED_TP, "10GBASE-CX4" }, 494 { t3_ael1006_phy_prep, CAPS_10G | SUPPORTED_FIBRE, 495 "10GBASE-SR" }, 496 { NULL, CAPS_10G | SUPPORTED_TP, "10GBASE-CX4" }, | 504 { t3_ael1002_phy_prep }, 505 { t3_vsc8211_phy_prep }, 506 { t3_mv88e1xxx_phy_prep }, 507 { t3_xaui_direct_phy_prep }, 508 { NULL }, 509 { t3_qt2045_phy_prep }, 510 { t3_ael1006_phy_prep }, 511 { NULL }, |
497}; 498 | 512}; 513 |
499#undef CAPS_1G 500#undef CAPS_10G 501 | |
502#define VPD_ENTRY(name, len) \ | 514#define VPD_ENTRY(name, len) \ |
503 u8 name##_kword[2]; u8 name##_len; char name##_data[len] | 515 u8 name##_kword[2]; u8 name##_len; u8 name##_data[len] |
504 505/* 506 * Partial EEPROM Vital Product Data structure. Includes only the ID and 507 * VPD-R sections. 508 */ 509struct t3_vpd { 510 u8 id_tag; 511 u8 id_len[2]; --- 161 unchanged lines hidden (view full) --- 673 } 674 675 for (i = 0; i < 6; i++) 676 p->eth_base[i] = hex2int(vpd.na_data[2 * i]) * 16 + 677 hex2int(vpd.na_data[2 * i + 1]); 678 return 0; 679} 680 | 516 517/* 518 * Partial EEPROM Vital Product Data structure. Includes only the ID and 519 * VPD-R sections. 520 */ 521struct t3_vpd { 522 u8 id_tag; 523 u8 id_len[2]; --- 161 unchanged lines hidden (view full) --- 685 } 686 687 for (i = 0; i < 6; i++) 688 p->eth_base[i] = hex2int(vpd.na_data[2 * i]) * 16 + 689 hex2int(vpd.na_data[2 * i + 1]); 690 return 0; 691} 692 |
693/* BIOS boot header */ 694typedef struct boot_header_s { 695 u8 signature[2]; /* signature */ 696 u8 length; /* image length (include header) */ 697 u8 offset[4]; /* initialization vector */ 698 u8 reserved[19]; /* reserved */ 699 u8 exheader[2]; /* offset to expansion header */ 700} boot_header_t; 701 |
|
681/* serial flash and firmware constants */ 682enum { 683 SF_ATTEMPTS = 5, /* max retries for SF1 operations */ 684 SF_SEC_SIZE = 64 * 1024, /* serial flash sector size */ 685 SF_SIZE = SF_SEC_SIZE * 8, /* serial flash size */ 686 687 /* flash command opcodes */ 688 SF_PROG_PAGE = 2, /* program page */ 689 SF_WR_DISABLE = 4, /* disable writes */ 690 SF_RD_STATUS = 5, /* read status register */ 691 SF_WR_ENABLE = 6, /* enable writes */ 692 SF_RD_DATA_FAST = 0xb, /* read flash */ 693 SF_ERASE_SECTOR = 0xd8, /* erase sector */ 694 695 FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */ 696 FW_VERS_ADDR = 0x77ffc, /* flash address holding FW version */ | 702/* serial flash and firmware constants */ 703enum { 704 SF_ATTEMPTS = 5, /* max retries for SF1 operations */ 705 SF_SEC_SIZE = 64 * 1024, /* serial flash sector size */ 706 SF_SIZE = SF_SEC_SIZE * 8, /* serial flash size */ 707 708 /* flash command opcodes */ 709 SF_PROG_PAGE = 2, /* program page */ 710 SF_WR_DISABLE = 4, /* disable writes */ 711 SF_RD_STATUS = 5, /* read status register */ 712 SF_WR_ENABLE = 6, /* enable writes */ 713 SF_RD_DATA_FAST = 0xb, /* read flash */ 714 SF_ERASE_SECTOR = 0xd8, /* erase sector */ 715 716 FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */ 717 FW_VERS_ADDR = 0x77ffc, /* flash address holding FW version */ |
697 FW_MIN_SIZE = 8 /* at least version and csum */ | 718 FW_MIN_SIZE = 8, /* at least version and csum */ 719 FW_MAX_SIZE = FW_VERS_ADDR - FW_FLASH_BOOT_ADDR, 720 721 BOOT_FLASH_BOOT_ADDR = 0x0,/* start address of boot image in flash */ 722 BOOT_SIGNATURE = 0xaa55, /* signature of BIOS boot ROM */ 723 BOOT_SIZE_INC = 512, /* image size measured in 512B chunks */ 724 BOOT_MIN_SIZE = sizeof(boot_header_t), /* at least basic header */ 725 BOOT_MAX_SIZE = 0xff*BOOT_SIZE_INC /* 1 byte * length increment */ |
698}; 699 700/** 701 * sf1_read - read data from the serial flash 702 * @adapter: the adapter 703 * @byte_cnt: number of bytes to read 704 * @cont: whether another operation will be chained 705 * @valp: where to store the read data --- 106 unchanged lines hidden (view full) --- 812} 813 814/** 815 * t3_write_flash - write up to a page of data to the serial flash 816 * @adapter: the adapter 817 * @addr: the start address to write 818 * @n: length of data to write 819 * @data: the data to write | 726}; 727 728/** 729 * sf1_read - read data from the serial flash 730 * @adapter: the adapter 731 * @byte_cnt: number of bytes to read 732 * @cont: whether another operation will be chained 733 * @valp: where to store the read data --- 106 unchanged lines hidden (view full) --- 840} 841 842/** 843 * t3_write_flash - write up to a page of data to the serial flash 844 * @adapter: the adapter 845 * @addr: the start address to write 846 * @n: length of data to write 847 * @data: the data to write |
848 * @byte_oriented: whether to store data as bytes or as words |
|
820 * 821 * Writes up to a page of data (256 bytes) to the serial flash starting 822 * at the given address. | 849 * 850 * Writes up to a page of data (256 bytes) to the serial flash starting 851 * at the given address. |
852 * If @byte_oriented is set the write data is stored as a 32-bit 853 * big-endian array, otherwise in the processor's native endianess. 854 * |
|
823 */ 824static int t3_write_flash(adapter_t *adapter, unsigned int addr, | 855 */ 856static int t3_write_flash(adapter_t *adapter, unsigned int addr, |
825 unsigned int n, const u8 *data) | 857 unsigned int n, const u8 *data, 858 int byte_oriented) |
826{ 827 int ret; 828 u32 buf[64]; | 859{ 860 int ret; 861 u32 buf[64]; |
829 unsigned int i, c, left, val, offset = addr & 0xff; | 862 unsigned int c, left, val, offset = addr & 0xff; |
830 831 if (addr + n > SF_SIZE || offset + n > 256) 832 return -EINVAL; 833 834 val = swab32(addr) | SF_PROG_PAGE; 835 836 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 || 837 (ret = sf1_write(adapter, 4, 1, val)) != 0) 838 return ret; 839 840 for (left = n; left; left -= c) { 841 c = min(left, 4U); | 863 864 if (addr + n > SF_SIZE || offset + n > 256) 865 return -EINVAL; 866 867 val = swab32(addr) | SF_PROG_PAGE; 868 869 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 || 870 (ret = sf1_write(adapter, 4, 1, val)) != 0) 871 return ret; 872 873 for (left = n; left; left -= c) { 874 c = min(left, 4U); |
842 for (val = 0, i = 0; i < c; ++i) 843 val = (val << 8) + *data++; | 875 val = *(const u32*)data; 876 data += c; 877 if (byte_oriented) 878 val = htonl(val); |
844 845 ret = sf1_write(adapter, c, c != left, val); 846 if (ret) 847 return ret; 848 } 849 if ((ret = flash_wait_op(adapter, 5, 1)) != 0) 850 return ret; 851 852 /* Read the page to verify the write succeeded */ | 879 880 ret = sf1_write(adapter, c, c != left, val); 881 if (ret) 882 return ret; 883 } 884 if ((ret = flash_wait_op(adapter, 5, 1)) != 0) 885 return ret; 886 887 /* Read the page to verify the write succeeded */ |
853 ret = t3_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1); | 888 ret = t3_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 889 byte_oriented); |
854 if (ret) 855 return ret; 856 857 if (memcmp(data - n, (u8 *)buf + offset, n)) 858 return -EIO; 859 return 0; 860} 861 --- 20 unchanged lines hidden (view full) --- 882 return 0; 883} 884 885/** 886 * t3_check_tpsram_version - read the tp sram version 887 * @adapter: the adapter 888 * 889 */ | 890 if (ret) 891 return ret; 892 893 if (memcmp(data - n, (u8 *)buf + offset, n)) 894 return -EIO; 895 return 0; 896} 897 --- 20 unchanged lines hidden (view full) --- 918 return 0; 919} 920 921/** 922 * t3_check_tpsram_version - read the tp sram version 923 * @adapter: the adapter 924 * 925 */ |
890int t3_check_tpsram_version(adapter_t *adapter) | 926int t3_check_tpsram_version(adapter_t *adapter, int *must_load) |
891{ 892 int ret; 893 u32 vers; 894 unsigned int major, minor; 895 | 927{ 928 int ret; 929 u32 vers; 930 unsigned int major, minor; 931 |
896 /* Get version loaded in SRAM */ 897 t3_write_reg(adapter, A_TP_EMBED_OP_FIELD0, 0); 898 ret = t3_wait_op_done(adapter, A_TP_EMBED_OP_FIELD0, 899 1, 1, 5, 1); | 932 if (adapter->params.rev == T3_REV_A) 933 return 0; 934 935 *must_load = 1; 936 937 ret = t3_get_tp_version(adapter, &vers); |
900 if (ret) 901 return ret; 902 903 vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1); 904 905 major = G_TP_VERSION_MAJOR(vers); 906 minor = G_TP_VERSION_MINOR(vers); 907 908 if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR) 909 return 0; 910 | 938 if (ret) 939 return ret; 940 941 vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1); 942 943 major = G_TP_VERSION_MAJOR(vers); 944 minor = G_TP_VERSION_MINOR(vers); 945 946 if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR) 947 return 0; 948 |
911 CH_WARN(adapter, "found wrong TP version (%u.%u), " 912 "driver needs version %d.%d\n", major, minor, 913 TP_VERSION_MAJOR, TP_VERSION_MINOR); | 949 if (major != TP_VERSION_MAJOR) 950 CH_ERR(adapter, "found wrong TP version (%u.%u), " 951 "driver needs version %d.%d\n", major, minor, 952 TP_VERSION_MAJOR, TP_VERSION_MINOR); 953 else { 954 *must_load = 0; 955 CH_ERR(adapter, "found wrong TP version (%u.%u), " 956 "driver compiled for version %d.%d\n", major, minor, 957 TP_VERSION_MAJOR, TP_VERSION_MINOR); 958 } |
914 return -EINVAL; 915} 916 917/** 918 * t3_check_tpsram - check if provided protocol SRAM 919 * is compatible with this driver 920 * @adapter: the adapter 921 * @tp_sram: the firmware image to write --- 39 unchanged lines hidden (view full) --- 961 962/** 963 * t3_check_fw_version - check if the FW is compatible with this driver 964 * @adapter: the adapter 965 * 966 * Checks if an adapter's FW is compatible with the driver. Returns 0 967 * if the versions are compatible, a negative error otherwise. 968 */ | 959 return -EINVAL; 960} 961 962/** 963 * t3_check_tpsram - check if provided protocol SRAM 964 * is compatible with this driver 965 * @adapter: the adapter 966 * @tp_sram: the firmware image to write --- 39 unchanged lines hidden (view full) --- 1006 1007/** 1008 * t3_check_fw_version - check if the FW is compatible with this driver 1009 * @adapter: the adapter 1010 * 1011 * Checks if an adapter's FW is compatible with the driver. Returns 0 1012 * if the versions are compatible, a negative error otherwise. 1013 */ |
969int t3_check_fw_version(adapter_t *adapter) | 1014int t3_check_fw_version(adapter_t *adapter, int *must_load) |
970{ 971 int ret; 972 u32 vers; 973 unsigned int type, major, minor; 974 | 1015{ 1016 int ret; 1017 u32 vers; 1018 unsigned int type, major, minor; 1019 |
1020 *must_load = 1; |
|
975 ret = t3_get_fw_version(adapter, &vers); 976 if (ret) 977 return ret; 978 979 type = G_FW_VERSION_TYPE(vers); 980 major = G_FW_VERSION_MAJOR(vers); 981 minor = G_FW_VERSION_MINOR(vers); 982 983 if (type == FW_VERSION_T3 && major == FW_VERSION_MAJOR && 984 minor == FW_VERSION_MINOR) 985 return 0; 986 | 1021 ret = t3_get_fw_version(adapter, &vers); 1022 if (ret) 1023 return ret; 1024 1025 type = G_FW_VERSION_TYPE(vers); 1026 major = G_FW_VERSION_MAJOR(vers); 1027 minor = G_FW_VERSION_MINOR(vers); 1028 1029 if (type == FW_VERSION_T3 && major == FW_VERSION_MAJOR && 1030 minor == FW_VERSION_MINOR) 1031 return 0; 1032 |
987 CH_WARN(adapter, "found wrong FW version (%u.%u), " 988 "driver needs version %d.%d\n", major, minor, 989 FW_VERSION_MAJOR, FW_VERSION_MINOR); | 1033 if (major != FW_VERSION_MAJOR) 1034 CH_ERR(adapter, "found wrong FW version(%u.%u), " 1035 "driver needs version %u.%u\n", major, minor, 1036 FW_VERSION_MAJOR, FW_VERSION_MINOR); 1037 else if ((int)minor < FW_VERSION_MINOR) { 1038 *must_load = 0; 1039 CH_WARN(adapter, "found old FW minor version(%u.%u), " 1040 "driver compiled for version %u.%u\n", major, minor, 1041 FW_VERSION_MAJOR, FW_VERSION_MINOR); 1042 } else { 1043 CH_WARN(adapter, "found newer FW version(%u.%u), " 1044 "driver compiled for version %u.%u\n", major, minor, 1045 FW_VERSION_MAJOR, FW_VERSION_MINOR); 1046 return 0; 1047 } |
990 return -EINVAL; 991} 992 993/** 994 * t3_flash_erase_sectors - erase a range of flash sectors 995 * @adapter: the adapter 996 * @start: the first sector to erase 997 * @end: the last sector to erase --- 30 unchanged lines hidden (view full) --- 1028{ 1029 u32 csum; 1030 unsigned int i; 1031 const u32 *p = (const u32 *)fw_data; 1032 int ret, addr, fw_sector = FW_FLASH_BOOT_ADDR >> 16; 1033 1034 if ((size & 3) || size < FW_MIN_SIZE) 1035 return -EINVAL; | 1048 return -EINVAL; 1049} 1050 1051/** 1052 * t3_flash_erase_sectors - erase a range of flash sectors 1053 * @adapter: the adapter 1054 * @start: the first sector to erase 1055 * @end: the last sector to erase --- 30 unchanged lines hidden (view full) --- 1086{ 1087 u32 csum; 1088 unsigned int i; 1089 const u32 *p = (const u32 *)fw_data; 1090 int ret, addr, fw_sector = FW_FLASH_BOOT_ADDR >> 16; 1091 1092 if ((size & 3) || size < FW_MIN_SIZE) 1093 return -EINVAL; |
1036 if (size > FW_VERS_ADDR + 8 - FW_FLASH_BOOT_ADDR) | 1094 if (size - 8 > FW_MAX_SIZE) |
1037 return -EFBIG; 1038 1039 for (csum = 0, i = 0; i < size / sizeof(csum); i++) 1040 csum += ntohl(p[i]); 1041 if (csum != 0xffffffff) { 1042 CH_ERR(adapter, "corrupted firmware image, checksum %u\n", 1043 csum); 1044 return -EINVAL; 1045 } 1046 1047 ret = t3_flash_erase_sectors(adapter, fw_sector, fw_sector); 1048 if (ret) 1049 goto out; 1050 1051 size -= 8; /* trim off version and checksum */ 1052 for (addr = FW_FLASH_BOOT_ADDR; size; ) { 1053 unsigned int chunk_size = min(size, 256U); 1054 | 1095 return -EFBIG; 1096 1097 for (csum = 0, i = 0; i < size / sizeof(csum); i++) 1098 csum += ntohl(p[i]); 1099 if (csum != 0xffffffff) { 1100 CH_ERR(adapter, "corrupted firmware image, checksum %u\n", 1101 csum); 1102 return -EINVAL; 1103 } 1104 1105 ret = t3_flash_erase_sectors(adapter, fw_sector, fw_sector); 1106 if (ret) 1107 goto out; 1108 1109 size -= 8; /* trim off version and checksum */ 1110 for (addr = FW_FLASH_BOOT_ADDR; size; ) { 1111 unsigned int chunk_size = min(size, 256U); 1112 |
1055 ret = t3_write_flash(adapter, addr, chunk_size, fw_data); | 1113 ret = t3_write_flash(adapter, addr, chunk_size, fw_data, 1); |
1056 if (ret) 1057 goto out; 1058 1059 addr += chunk_size; 1060 fw_data += chunk_size; 1061 size -= chunk_size; 1062 } 1063 | 1114 if (ret) 1115 goto out; 1116 1117 addr += chunk_size; 1118 fw_data += chunk_size; 1119 size -= chunk_size; 1120 } 1121 |
1064 ret = t3_write_flash(adapter, FW_VERS_ADDR, 4, fw_data); | 1122 ret = t3_write_flash(adapter, FW_VERS_ADDR, 4, fw_data, 1); |
1065out: 1066 if (ret) 1067 CH_ERR(adapter, "firmware download failed, error %d\n", ret); 1068 return ret; 1069} 1070 | 1123out: 1124 if (ret) 1125 CH_ERR(adapter, "firmware download failed, error %d\n", ret); 1126 return ret; 1127} 1128 |
1129/* 1130 * t3_load_boot - download boot flash 1131 * @adapter: the adapter 1132 * @boot_data: the boot image to write 1133 * @size: image size 1134 * 1135 * Write the supplied boot image to the card's serial flash. 1136 * The boot image has the following sections: a 28-byte header and the 1137 * boot image. 1138 */ 1139int t3_load_boot(adapter_t *adapter, u8 *boot_data, unsigned int size) 1140{ 1141 boot_header_t *header = (boot_header_t *)boot_data; 1142 int ret; 1143 unsigned int addr; 1144 unsigned int boot_sector = BOOT_FLASH_BOOT_ADDR >> 16; 1145 unsigned int boot_end = (BOOT_FLASH_BOOT_ADDR + size - 1) >> 16; 1146 1147 /* 1148 * Perform some primitive sanity testing to avoid accidentally 1149 * writing garbage over the boot sectors. We ought to check for 1150 * more but it's not worth it for now ... 1151 */ 1152 if (size < BOOT_MIN_SIZE || size > BOOT_MAX_SIZE) { 1153 CH_ERR(adapter, "boot image too small/large\n"); 1154 return -EFBIG; 1155 } 1156 if (le16_to_cpu(*(u16*)header->signature) != BOOT_SIGNATURE) { 1157 CH_ERR(adapter, "boot image missing signature\n"); 1158 return -EINVAL; 1159 } 1160 if (header->length * BOOT_SIZE_INC != size) { 1161 CH_ERR(adapter, "boot image header length != image length\n"); 1162 return -EINVAL; 1163 } 1164 1165 ret = t3_flash_erase_sectors(adapter, boot_sector, boot_end); 1166 if (ret) 1167 goto out; 1168 1169 for (addr = BOOT_FLASH_BOOT_ADDR; size; ) { 1170 unsigned int chunk_size = min(size, 256U); 1171 1172 ret = t3_write_flash(adapter, addr, chunk_size, boot_data, 0); 1173 if (ret) 1174 goto out; 1175 1176 addr += chunk_size; 1177 boot_data += chunk_size; 1178 size -= chunk_size; 1179 } 1180 1181out: 1182 if (ret) 1183 CH_ERR(adapter, "boot image download failed, error %d\n", ret); 1184 return ret; 1185} 1186 |
|
1071#define CIM_CTL_BASE 0x2000 1072 1073/** 1074 * t3_cim_ctl_blk_read - read a block from CIM control region 1075 * @adap: the adapter 1076 * @addr: the start address within the CIM control region 1077 * @n: number of words to read 1078 * @valp: where to store the result --- 91 unchanged lines hidden (view full) --- 1170 if (lc->autoneg == AUTONEG_DISABLE) { 1171 lc->speed = lc->requested_speed; 1172 lc->duplex = lc->requested_duplex; 1173 lc->fc = (unsigned char)fc; 1174 t3_mac_set_speed_duplex_fc(mac, lc->speed, lc->duplex, 1175 fc); 1176 /* Also disables autoneg */ 1177 phy->ops->set_speed_duplex(phy, lc->speed, lc->duplex); | 1187#define CIM_CTL_BASE 0x2000 1188 1189/** 1190 * t3_cim_ctl_blk_read - read a block from CIM control region 1191 * @adap: the adapter 1192 * @addr: the start address within the CIM control region 1193 * @n: number of words to read 1194 * @valp: where to store the result --- 91 unchanged lines hidden (view full) --- 1286 if (lc->autoneg == AUTONEG_DISABLE) { 1287 lc->speed = lc->requested_speed; 1288 lc->duplex = lc->requested_duplex; 1289 lc->fc = (unsigned char)fc; 1290 t3_mac_set_speed_duplex_fc(mac, lc->speed, lc->duplex, 1291 fc); 1292 /* Also disables autoneg */ 1293 phy->ops->set_speed_duplex(phy, lc->speed, lc->duplex); |
1178 phy->ops->reset(phy, 0); | |
1179 } else 1180 phy->ops->autoneg_enable(phy); 1181 } else { 1182 t3_mac_set_speed_duplex_fc(mac, -1, -1, fc); 1183 lc->fc = (unsigned char)fc; 1184 phy->ops->reset(phy, 0); 1185 } 1186 return 0; --- 56 unchanged lines hidden (view full) --- 1243 if (acts->stat_idx >= 0) 1244 stats[acts->stat_idx]++; 1245 } 1246 if (status) /* clear processed interrupts */ 1247 t3_write_reg(adapter, reg, status); 1248 return fatal; 1249} 1250 | 1294 } else 1295 phy->ops->autoneg_enable(phy); 1296 } else { 1297 t3_mac_set_speed_duplex_fc(mac, -1, -1, fc); 1298 lc->fc = (unsigned char)fc; 1299 phy->ops->reset(phy, 0); 1300 } 1301 return 0; --- 56 unchanged lines hidden (view full) --- 1358 if (acts->stat_idx >= 0) 1359 stats[acts->stat_idx]++; 1360 } 1361 if (status) /* clear processed interrupts */ 1362 t3_write_reg(adapter, reg, status); 1363 return fatal; 1364} 1365 |
1251#define SGE_INTR_MASK (F_RSPQDISABLED) | 1366#define SGE_INTR_MASK (F_RSPQDISABLED | \ 1367 F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR | \ 1368 F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \ 1369 F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \ 1370 V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \ 1371 F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \ 1372 F_HIRCQPARITYERROR) |
1252#define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \ 1253 F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \ 1254 F_NFASRCHFAIL) 1255#define MC7_INTR_MASK (F_AE | F_UE | F_CE | V_PE(M_PE)) 1256#define XGM_INTR_MASK (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \ 1257 V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR) | \ 1258 F_TXFIFO_UNDERRUN | F_RXFIFO_OVERFLOW) 1259#define PCIX_INTR_MASK (F_MSTDETPARERR | F_SIGTARABT | F_RCVTARABT | \ 1260 F_RCVMSTABT | F_SIGSYSERR | F_DETPARERR | \ 1261 F_SPLCMPDIS | F_UNXSPLCMP | F_RCVSPLCMPERR | \ 1262 F_DETCORECCERR | F_DETUNCECCERR | F_PIOPARERR | \ 1263 V_WFPARERR(M_WFPARERR) | V_RFPARERR(M_RFPARERR) | \ 1264 V_CFPARERR(M_CFPARERR) /* | V_MSIXPARERR(M_MSIXPARERR) */) 1265#define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\ 1266 F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \ 1267 /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \ | 1373#define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \ 1374 F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \ 1375 F_NFASRCHFAIL) 1376#define MC7_INTR_MASK (F_AE | F_UE | F_CE | V_PE(M_PE)) 1377#define XGM_INTR_MASK (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \ 1378 V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR) | \ 1379 F_TXFIFO_UNDERRUN | F_RXFIFO_OVERFLOW) 1380#define PCIX_INTR_MASK (F_MSTDETPARERR | F_SIGTARABT | F_RCVTARABT | \ 1381 F_RCVMSTABT | F_SIGSYSERR | F_DETPARERR | \ 1382 F_SPLCMPDIS | F_UNXSPLCMP | F_RCVSPLCMPERR | \ 1383 F_DETCORECCERR | F_DETUNCECCERR | F_PIOPARERR | \ 1384 V_WFPARERR(M_WFPARERR) | V_RFPARERR(M_RFPARERR) | \ 1385 V_CFPARERR(M_CFPARERR) /* | V_MSIXPARERR(M_MSIXPARERR) */) 1386#define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\ 1387 F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \ 1388 /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \ |
1268 V_BISTERR(M_BISTERR) | F_PEXERR) 1269#define ULPRX_INTR_MASK F_PARERR 1270#define ULPTX_INTR_MASK 0 1271#define CPLSW_INTR_MASK (F_TP_FRAMING_ERROR | \ | 1389 F_RETRYBUFPARERR | F_RETRYLUTPARERR | F_RXPARERR | \ 1390 F_TXPARERR | V_BISTERR(M_BISTERR)) 1391#define ULPRX_INTR_MASK (F_PARERRDATA | F_PARERRPCMD | F_ARBPF1PERR | \ 1392 F_ARBPF0PERR | F_ARBFPERR | F_PCMDMUXPERR | \ 1393 F_DATASELFRAMEERR1 | F_DATASELFRAMEERR0) 1394#define ULPTX_INTR_MASK 0xfc 1395#define CPLSW_INTR_MASK (F_CIM_OP_MAP_PERR | F_TP_FRAMING_ERROR | \ |
1272 F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \ 1273 F_ZERO_SWITCH_ERROR) 1274#define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \ 1275 F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \ 1276 F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \ | 1396 F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \ 1397 F_ZERO_SWITCH_ERROR) 1398#define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \ 1399 F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \ 1400 F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \ |
1277 F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT) | 1401 F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT | \ 1402 F_DRAMPARERR | F_ICACHEPARERR | F_DCACHEPARERR | \ 1403 F_OBQSGEPARERR | F_OBQULPHIPARERR | F_OBQULPLOPARERR | \ 1404 F_IBQSGELOPARERR | F_IBQSGEHIPARERR | F_IBQULPPARERR | \ 1405 F_IBQTPPARERR | F_ITAGPARERR | F_DTAGPARERR) |
1278#define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \ 1279 V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \ 1280 V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR)) 1281#define PMRX_INTR_MASK (F_ZERO_E_CMD_ERROR | IESPI_FRM_ERR | OCSPI_FRM_ERR | \ 1282 V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR) | \ 1283 V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR)) 1284#define MPS_INTR_MASK (V_TX0TPPARERRENB(M_TX0TPPARERRENB) | \ 1285 V_TX1TPPARERRENB(M_TX1TPPARERRENB) | \ --- 52 unchanged lines hidden (view full) --- 1338 { F_UNXSPLCPLERRC, 1339 "PCI unexpected split completion DMA command error", -1, 1 }, 1340 { F_PCIE_PIOPARERR, "PCI PIO FIFO parity error", -1, 1 }, 1341 { F_PCIE_WFPARERR, "PCI write FIFO parity error", -1, 1 }, 1342 { F_PCIE_RFPARERR, "PCI read FIFO parity error", -1, 1 }, 1343 { F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1 }, 1344 { V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR), 1345 "PCI MSI-X table/PBA parity error", -1, 1 }, | 1406#define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \ 1407 V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \ 1408 V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR)) 1409#define PMRX_INTR_MASK (F_ZERO_E_CMD_ERROR | IESPI_FRM_ERR | OCSPI_FRM_ERR | \ 1410 V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR) | \ 1411 V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR)) 1412#define MPS_INTR_MASK (V_TX0TPPARERRENB(M_TX0TPPARERRENB) | \ 1413 V_TX1TPPARERRENB(M_TX1TPPARERRENB) | \ --- 52 unchanged lines hidden (view full) --- 1466 { F_UNXSPLCPLERRC, 1467 "PCI unexpected split completion DMA command error", -1, 1 }, 1468 { F_PCIE_PIOPARERR, "PCI PIO FIFO parity error", -1, 1 }, 1469 { F_PCIE_WFPARERR, "PCI write FIFO parity error", -1, 1 }, 1470 { F_PCIE_RFPARERR, "PCI read FIFO parity error", -1, 1 }, 1471 { F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1 }, 1472 { V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR), 1473 "PCI MSI-X table/PBA parity error", -1, 1 }, |
1474 { F_RETRYBUFPARERR, "PCI retry buffer parity error", -1, 1 }, 1475 { F_RETRYLUTPARERR, "PCI retry LUT parity error", -1, 1 }, 1476 { F_RXPARERR, "PCI Rx parity error", -1, 1 }, 1477 { F_TXPARERR, "PCI Tx parity error", -1, 1 }, |
|
1346 { V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1 }, 1347 { 0 } 1348 }; 1349 1350 if (t3_read_reg(adapter, A_PCIE_INT_CAUSE) & F_PEXERR) 1351 CH_ALERT(adapter, "PEX error code 0x%x\n", 1352 t3_read_reg(adapter, A_PCIE_PEX_ERR)); 1353 --- 8 unchanged lines hidden (view full) --- 1362static void tp_intr_handler(adapter_t *adapter) 1363{ 1364 static struct intr_info tp_intr_info[] = { 1365 { 0xffffff, "TP parity error", -1, 1 }, 1366 { 0x1000000, "TP out of Rx pages", -1, 1 }, 1367 { 0x2000000, "TP out of Tx pages", -1, 1 }, 1368 { 0 } 1369 }; | 1478 { V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1 }, 1479 { 0 } 1480 }; 1481 1482 if (t3_read_reg(adapter, A_PCIE_INT_CAUSE) & F_PEXERR) 1483 CH_ALERT(adapter, "PEX error code 0x%x\n", 1484 t3_read_reg(adapter, A_PCIE_PEX_ERR)); 1485 --- 8 unchanged lines hidden (view full) --- 1494static void tp_intr_handler(adapter_t *adapter) 1495{ 1496 static struct intr_info tp_intr_info[] = { 1497 { 0xffffff, "TP parity error", -1, 1 }, 1498 { 0x1000000, "TP out of Rx pages", -1, 1 }, 1499 { 0x2000000, "TP out of Tx pages", -1, 1 }, 1500 { 0 } 1501 }; |
1502 static struct intr_info tp_intr_info_t3c[] = { 1503 { 0x1fffffff, "TP parity error", -1, 1 }, 1504 { F_FLMRXFLSTEMPTY, "TP out of Rx pages", -1, 1 }, 1505 { F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1 }, 1506 { 0 } 1507 }; |
|
1370 1371 if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff, | 1508 1509 if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff, |
1372 tp_intr_info, NULL)) | 1510 adapter->params.rev < T3_REV_C ? 1511 tp_intr_info : tp_intr_info_t3c, NULL)) |
1373 t3_fatal_err(adapter); 1374} 1375 1376/* 1377 * CIM interrupt handler. 1378 */ 1379static void cim_intr_handler(adapter_t *adapter) 1380{ --- 5 unchanged lines hidden (view full) --- 1386 { F_WRBLKFLASHINT, "CIM write to cached flash space", -1, 1 }, 1387 { F_SGLWRFLASHINT, "CIM single write to flash space", -1, 1 }, 1388 { F_BLKRDFLASHINT, "CIM block read from flash space", -1, 1 }, 1389 { F_BLKWRFLASHINT, "CIM block write to flash space", -1, 1 }, 1390 { F_BLKRDCTLINT, "CIM block read from CTL space", -1, 1 }, 1391 { F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1 }, 1392 { F_BLKRDPLINT, "CIM block read from PL space", -1, 1 }, 1393 { F_BLKWRPLINT, "CIM block write to PL space", -1, 1 }, | 1512 t3_fatal_err(adapter); 1513} 1514 1515/* 1516 * CIM interrupt handler. 1517 */ 1518static void cim_intr_handler(adapter_t *adapter) 1519{ --- 5 unchanged lines hidden (view full) --- 1525 { F_WRBLKFLASHINT, "CIM write to cached flash space", -1, 1 }, 1526 { F_SGLWRFLASHINT, "CIM single write to flash space", -1, 1 }, 1527 { F_BLKRDFLASHINT, "CIM block read from flash space", -1, 1 }, 1528 { F_BLKWRFLASHINT, "CIM block write to flash space", -1, 1 }, 1529 { F_BLKRDCTLINT, "CIM block read from CTL space", -1, 1 }, 1530 { F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1 }, 1531 { F_BLKRDPLINT, "CIM block read from PL space", -1, 1 }, 1532 { F_BLKWRPLINT, "CIM block write to PL space", -1, 1 }, |
1533 { F_DRAMPARERR, "CIM DRAM parity error", -1, 1 }, 1534 { F_ICACHEPARERR, "CIM icache parity error", -1, 1 }, 1535 { F_DCACHEPARERR, "CIM dcache parity error", -1, 1 }, 1536 { F_OBQSGEPARERR, "CIM OBQ SGE parity error", -1, 1 }, 1537 { F_OBQULPHIPARERR, "CIM OBQ ULPHI parity error", -1, 1 }, 1538 { F_OBQULPLOPARERR, "CIM OBQ ULPLO parity error", -1, 1 }, 1539 { F_IBQSGELOPARERR, "CIM IBQ SGELO parity error", -1, 1 }, 1540 { F_IBQSGEHIPARERR, "CIM IBQ SGEHI parity error", -1, 1 }, 1541 { F_IBQULPPARERR, "CIM IBQ ULP parity error", -1, 1 }, 1542 { F_IBQTPPARERR, "CIM IBQ TP parity error", -1, 1 }, 1543 { F_ITAGPARERR, "CIM itag parity error", -1, 1 }, 1544 { F_DTAGPARERR, "CIM dtag parity error", -1, 1 }, |
|
1394 { 0 } 1395 }; 1396 | 1545 { 0 } 1546 }; 1547 |
1397 if (t3_handle_intr_status(adapter, A_CIM_HOST_INT_CAUSE, 0xffffffff, | 1548 if (t3_handle_intr_status(adapter, A_CIM_HOST_INT_CAUSE, CIM_INTR_MASK, |
1398 cim_intr_info, NULL)) 1399 t3_fatal_err(adapter); 1400} 1401 1402/* 1403 * ULP RX interrupt handler. 1404 */ 1405static void ulprx_intr_handler(adapter_t *adapter) 1406{ 1407 static struct intr_info ulprx_intr_info[] = { | 1549 cim_intr_info, NULL)) 1550 t3_fatal_err(adapter); 1551} 1552 1553/* 1554 * ULP RX interrupt handler. 1555 */ 1556static void ulprx_intr_handler(adapter_t *adapter) 1557{ 1558 static struct intr_info ulprx_intr_info[] = { |
1408 { F_PARERR, "ULP RX parity error", -1, 1 }, | 1559 { F_PARERRDATA, "ULP RX data parity error", -1, 1 }, 1560 { F_PARERRPCMD, "ULP RX command parity error", -1, 1 }, 1561 { F_ARBPF1PERR, "ULP RX ArbPF1 parity error", -1, 1 }, 1562 { F_ARBPF0PERR, "ULP RX ArbPF0 parity error", -1, 1 }, 1563 { F_ARBFPERR, "ULP RX ArbF parity error", -1, 1 }, 1564 { F_PCMDMUXPERR, "ULP RX PCMDMUX parity error", -1, 1 }, 1565 { F_DATASELFRAMEERR1, "ULP RX frame error", -1, 1 }, 1566 { F_DATASELFRAMEERR0, "ULP RX frame error", -1, 1 }, |
1409 { 0 } 1410 }; 1411 1412 if (t3_handle_intr_status(adapter, A_ULPRX_INT_CAUSE, 0xffffffff, 1413 ulprx_intr_info, NULL)) 1414 t3_fatal_err(adapter); 1415} 1416 1417/* 1418 * ULP TX interrupt handler. 1419 */ 1420static void ulptx_intr_handler(adapter_t *adapter) 1421{ 1422 static struct intr_info ulptx_intr_info[] = { 1423 { F_PBL_BOUND_ERR_CH0, "ULP TX channel 0 PBL out of bounds", 1424 STAT_ULP_CH0_PBL_OOB, 0 }, 1425 { F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds", 1426 STAT_ULP_CH1_PBL_OOB, 0 }, | 1567 { 0 } 1568 }; 1569 1570 if (t3_handle_intr_status(adapter, A_ULPRX_INT_CAUSE, 0xffffffff, 1571 ulprx_intr_info, NULL)) 1572 t3_fatal_err(adapter); 1573} 1574 1575/* 1576 * ULP TX interrupt handler. 1577 */ 1578static void ulptx_intr_handler(adapter_t *adapter) 1579{ 1580 static struct intr_info ulptx_intr_info[] = { 1581 { F_PBL_BOUND_ERR_CH0, "ULP TX channel 0 PBL out of bounds", 1582 STAT_ULP_CH0_PBL_OOB, 0 }, 1583 { F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds", 1584 STAT_ULP_CH1_PBL_OOB, 0 }, |
1585 { 0xfc, "ULP TX parity error", -1, 1 }, |
|
1427 { 0 } 1428 }; 1429 1430 if (t3_handle_intr_status(adapter, A_ULPTX_INT_CAUSE, 0xffffffff, 1431 ulptx_intr_info, adapter->irq_stats)) 1432 t3_fatal_err(adapter); 1433} 1434 --- 58 unchanged lines hidden (view full) --- 1493} 1494 1495/* 1496 * CPL switch interrupt handler. 1497 */ 1498static void cplsw_intr_handler(adapter_t *adapter) 1499{ 1500 static struct intr_info cplsw_intr_info[] = { | 1586 { 0 } 1587 }; 1588 1589 if (t3_handle_intr_status(adapter, A_ULPTX_INT_CAUSE, 0xffffffff, 1590 ulptx_intr_info, adapter->irq_stats)) 1591 t3_fatal_err(adapter); 1592} 1593 --- 58 unchanged lines hidden (view full) --- 1652} 1653 1654/* 1655 * CPL switch interrupt handler. 1656 */ 1657static void cplsw_intr_handler(adapter_t *adapter) 1658{ 1659 static struct intr_info cplsw_intr_info[] = { |
1501// { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 }, | 1660 { F_CIM_OP_MAP_PERR, "CPL switch CIM parity error", -1, 1 }, 1661 { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 }, |
1502 { F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1 }, 1503 { F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1 }, 1504 { F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1 }, 1505 { F_ZERO_SWITCH_ERROR, "CPL switch no-switch error", -1, 1 }, 1506 { 0 } 1507 }; 1508 1509 if (t3_handle_intr_status(adapter, A_CPL_INTR_CAUSE, 0xffffffff, --- 117 unchanged lines hidden (view full) --- 1627 u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE); 1628 1629 for_each_port(adapter, i) { 1630 struct port_info *p = adap2pinfo(adapter, i); 1631 1632 mask = gpi - (gpi & (gpi - 1)); 1633 gpi -= mask; 1634 | 1662 { F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1 }, 1663 { F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1 }, 1664 { F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1 }, 1665 { F_ZERO_SWITCH_ERROR, "CPL switch no-switch error", -1, 1 }, 1666 { 0 } 1667 }; 1668 1669 if (t3_handle_intr_status(adapter, A_CPL_INTR_CAUSE, 0xffffffff, --- 117 unchanged lines hidden (view full) --- 1787 u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE); 1788 1789 for_each_port(adapter, i) { 1790 struct port_info *p = adap2pinfo(adapter, i); 1791 1792 mask = gpi - (gpi & (gpi - 1)); 1793 gpi -= mask; 1794 |
1635 if (!(p->port_type->caps & SUPPORTED_IRQ)) | 1795 if (!(p->phy.caps & SUPPORTED_IRQ)) |
1636 continue; 1637 1638 if (cause & mask) { 1639 int phy_cause = p->phy.ops->intr_handler(&p->phy); 1640 1641 if (phy_cause & cphy_cause_link_change) 1642 t3_link_changed(adapter, i); 1643 if (phy_cause & cphy_cause_fifo_error) --- 79 unchanged lines hidden (view full) --- 1723 { A_SG_INT_ENABLE, SGE_INTR_MASK }, 1724 { A_MC7_INT_ENABLE, MC7_INTR_MASK }, 1725 { A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR, 1726 MC7_INTR_MASK }, 1727 { A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR, 1728 MC7_INTR_MASK }, 1729 { A_MC5_DB_INT_ENABLE, MC5_INTR_MASK }, 1730 { A_ULPRX_INT_ENABLE, ULPRX_INTR_MASK }, | 1796 continue; 1797 1798 if (cause & mask) { 1799 int phy_cause = p->phy.ops->intr_handler(&p->phy); 1800 1801 if (phy_cause & cphy_cause_link_change) 1802 t3_link_changed(adapter, i); 1803 if (phy_cause & cphy_cause_fifo_error) --- 79 unchanged lines hidden (view full) --- 1883 { A_SG_INT_ENABLE, SGE_INTR_MASK }, 1884 { A_MC7_INT_ENABLE, MC7_INTR_MASK }, 1885 { A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR, 1886 MC7_INTR_MASK }, 1887 { A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR, 1888 MC7_INTR_MASK }, 1889 { A_MC5_DB_INT_ENABLE, MC5_INTR_MASK }, 1890 { A_ULPRX_INT_ENABLE, ULPRX_INTR_MASK }, |
1731 { A_TP_INT_ENABLE, 0x3bfffff }, | |
1732 { A_PM1_TX_INT_ENABLE, PMTX_INTR_MASK }, 1733 { A_PM1_RX_INT_ENABLE, PMRX_INTR_MASK }, 1734 { A_CIM_HOST_INT_ENABLE, CIM_INTR_MASK }, 1735 { A_MPS_INT_ENABLE, MPS_INTR_MASK }, 1736 }; 1737 1738 adapter->slow_intr_mask = PL_INTR_MASK; 1739 1740 t3_write_regs(adapter, intr_en_avp, ARRAY_SIZE(intr_en_avp), 0); | 1891 { A_PM1_TX_INT_ENABLE, PMTX_INTR_MASK }, 1892 { A_PM1_RX_INT_ENABLE, PMRX_INTR_MASK }, 1893 { A_CIM_HOST_INT_ENABLE, CIM_INTR_MASK }, 1894 { A_MPS_INT_ENABLE, MPS_INTR_MASK }, 1895 }; 1896 1897 adapter->slow_intr_mask = PL_INTR_MASK; 1898 1899 t3_write_regs(adapter, intr_en_avp, ARRAY_SIZE(intr_en_avp), 0); |
1900 t3_write_reg(adapter, A_TP_INT_ENABLE, 1901 adapter->params.rev >= T3_REV_C ? 0x2bfffff : 0x3bfffff); |
|
1741 1742 if (adapter->params.rev > 0) { 1743 t3_write_reg(adapter, A_CPL_INTR_ENABLE, 1744 CPLSW_INTR_MASK | F_CIM_OVFL_ERROR); 1745 t3_write_reg(adapter, A_ULPTX_INT_ENABLE, 1746 ULPTX_INTR_MASK | F_PBL_BOUND_ERR_CH0 | 1747 F_PBL_BOUND_ERR_CH1); 1748 } else { --- 135 unchanged lines hidden (view full) --- 1884 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff); 1885 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff); 1886 t3_write_reg(adapter, A_SG_CONTEXT_CMD, 1887 V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id)); 1888 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, 1889 0, SG_CONTEXT_CMD_ATTEMPTS, 1); 1890} 1891 | 1902 1903 if (adapter->params.rev > 0) { 1904 t3_write_reg(adapter, A_CPL_INTR_ENABLE, 1905 CPLSW_INTR_MASK | F_CIM_OVFL_ERROR); 1906 t3_write_reg(adapter, A_ULPTX_INT_ENABLE, 1907 ULPTX_INTR_MASK | F_PBL_BOUND_ERR_CH0 | 1908 F_PBL_BOUND_ERR_CH1); 1909 } else { --- 135 unchanged lines hidden (view full) --- 2045 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff); 2046 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff); 2047 t3_write_reg(adapter, A_SG_CONTEXT_CMD, 2048 V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id)); 2049 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, 2050 0, SG_CONTEXT_CMD_ATTEMPTS, 1); 2051} 2052 |
2053static int clear_sge_ctxt(adapter_t *adap, unsigned int id, unsigned int type) 2054{ 2055 t3_write_reg(adap, A_SG_CONTEXT_DATA0, 0); 2056 t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0); 2057 t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0); 2058 t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0); 2059 return t3_sge_write_context(adap, id, type); 2060} 2061 |
|
1892/** 1893 * t3_sge_init_ecntxt - initialize an SGE egress context 1894 * @adapter: the adapter to configure 1895 * @id: the context id 1896 * @gts_enable: whether to enable GTS for the context 1897 * @type: the egress context type 1898 * @respq: associated response queue 1899 * @base_addr: base address of queue --- 485 unchanged lines hidden (view full) --- 2385 unsigned int mask, unsigned int val) 2386{ 2387 t3_write_reg(adap, A_TP_PIO_ADDR, addr); 2388 val |= t3_read_reg(adap, A_TP_PIO_DATA) & ~mask; 2389 t3_write_reg(adap, A_TP_PIO_DATA, val); 2390} 2391 2392/** | 2062/** 2063 * t3_sge_init_ecntxt - initialize an SGE egress context 2064 * @adapter: the adapter to configure 2065 * @id: the context id 2066 * @gts_enable: whether to enable GTS for the context 2067 * @type: the egress context type 2068 * @respq: associated response queue 2069 * @base_addr: base address of queue --- 485 unchanged lines hidden (view full) --- 2555 unsigned int mask, unsigned int val) 2556{ 2557 t3_write_reg(adap, A_TP_PIO_ADDR, addr); 2558 val |= t3_read_reg(adap, A_TP_PIO_DATA) & ~mask; 2559 t3_write_reg(adap, A_TP_PIO_DATA, val); 2560} 2561 2562/** |
2393 * t3_enable_filters - enable the HW filters 2394 * @adap: the adapter 2395 * 2396 * Enables the HW filters for NIC traffic. 2397 */ 2398void t3_enable_filters(adapter_t *adap) 2399{ 2400 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_NICMODE, 0); 2401 t3_set_reg_field(adap, A_MC5_DB_CONFIG, 0, F_FILTEREN); 2402 t3_set_reg_field(adap, A_TP_GLOBAL_CONFIG, 0, V_FIVETUPLELOOKUP(3)); 2403 tp_wr_bits_indirect(adap, A_TP_INGRESS_CONFIG, 0, F_LOOKUPEVERYPKT); 2404} 2405 2406/** | |
2407 * pm_num_pages - calculate the number of pages of the payload memory 2408 * @mem_size: the size of the payload memory 2409 * @pg_size: the size of each payload memory page 2410 * 2411 * Calculate the number of pages, each of the given size, that fit in a 2412 * memory of the specified size, respecting the HW requirement that the 2413 * number of pages must be a multiple of 24. 2414 */ --- 88 unchanged lines hidden (view full) --- 2503 F_TCPCHECKSUMOFFLOAD | V_IPTTL(64)); 2504 t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) | 2505 F_MTUENABLE | V_WINDOWSCALEMODE(1) | 2506 V_TIMESTAMPSMODE(0) | V_SACKMODE(1) | V_SACKRX(1)); 2507 t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) | 2508 V_AUTOSTATE2(1) | V_AUTOSTATE1(0) | 2509 V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) | 2510 F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1)); | 2563 * pm_num_pages - calculate the number of pages of the payload memory 2564 * @mem_size: the size of the payload memory 2565 * @pg_size: the size of each payload memory page 2566 * 2567 * Calculate the number of pages, each of the given size, that fit in a 2568 * memory of the specified size, respecting the HW requirement that the 2569 * number of pages must be a multiple of 24. 2570 */ --- 88 unchanged lines hidden (view full) --- 2659 F_TCPCHECKSUMOFFLOAD | V_IPTTL(64)); 2660 t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) | 2661 F_MTUENABLE | V_WINDOWSCALEMODE(1) | 2662 V_TIMESTAMPSMODE(0) | V_SACKMODE(1) | V_SACKRX(1)); 2663 t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) | 2664 V_AUTOSTATE2(1) | V_AUTOSTATE1(0) | 2665 V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) | 2666 F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1)); |
2511 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_IPV6ENABLE | F_NICMODE, | 2667 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO, |
2512 F_IPV6ENABLE | F_NICMODE); 2513 t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814); 2514 t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105); 2515 t3_set_reg_field(adap, A_TP_PARA_REG6, 0, 2516 adap->params.rev > 0 ? F_ENABLEESND : 2517 F_T3A_ENABLEESND); 2518 t3_set_reg_field(adap, A_TP_PC_CONFIG, 2519 F_ENABLEEPCMDAFULL, 2520 F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK | 2521 F_TXCONGESTIONMODE | F_RXCONGESTIONMODE); | 2668 F_IPV6ENABLE | F_NICMODE); 2669 t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814); 2670 t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105); 2671 t3_set_reg_field(adap, A_TP_PARA_REG6, 0, 2672 adap->params.rev > 0 ? F_ENABLEESND : 2673 F_T3A_ENABLEESND); 2674 t3_set_reg_field(adap, A_TP_PC_CONFIG, 2675 F_ENABLEEPCMDAFULL, 2676 F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK | 2677 F_TXCONGESTIONMODE | F_RXCONGESTIONMODE); |
2522 t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 0); | 2678 t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 2679 F_ENABLEIPV6RSS | F_ENABLENONOFDTNLSYN | 2680 F_ENABLEARPMISS | F_DISBLEDAPARBIT0); |
2523 t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080); 2524 t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000); 2525 2526 if (adap->params.rev > 0) { 2527 tp_wr_indirect(adap, A_TP_EGRESS_CONFIG, F_REWRITEFORCETOSIZE); 2528 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, 2529 F_TXPACEAUTO | F_TXPACEAUTOSTRICT); 2530 t3_set_reg_field(adap, A_TP_PC_CONFIG, F_LOCKTID, F_LOCKTID); 2531 tp_wr_indirect(adap, A_TP_VLAN_PRI_MAP, 0xfa50); 2532 tp_wr_indirect(adap, A_TP_MAC_MATCH_MAP0, 0xfac688); 2533 tp_wr_indirect(adap, A_TP_MAC_MATCH_MAP1, 0xfac688); 2534 } else 2535 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEFIXED); 2536 | 2681 t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080); 2682 t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000); 2683 2684 if (adap->params.rev > 0) { 2685 tp_wr_indirect(adap, A_TP_EGRESS_CONFIG, F_REWRITEFORCETOSIZE); 2686 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, 2687 F_TXPACEAUTO | F_TXPACEAUTOSTRICT); 2688 t3_set_reg_field(adap, A_TP_PC_CONFIG, F_LOCKTID, F_LOCKTID); 2689 tp_wr_indirect(adap, A_TP_VLAN_PRI_MAP, 0xfa50); 2690 tp_wr_indirect(adap, A_TP_MAC_MATCH_MAP0, 0xfac688); 2691 tp_wr_indirect(adap, A_TP_MAC_MATCH_MAP1, 0xfac688); 2692 } else 2693 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEFIXED); 2694 |
2695 if (adap->params.rev == T3_REV_C) 2696 t3_set_reg_field(adap, A_TP_PC_CONFIG, 2697 V_TABLELATENCYDELTA(M_TABLELATENCYDELTA), 2698 V_TABLELATENCYDELTA(4)); 2699 |
|
2537 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT1, 0); 2538 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT0, 0); 2539 t3_write_reg(adap, A_TP_MOD_CHANNEL_WEIGHT, 0); 2540 t3_write_reg(adap, A_TP_MOD_RATE_LIMIT, 0xf2200000); 2541 2542 if (adap->params.nports > 2) { 2543 t3_set_reg_field(adap, A_TP_PC_CONFIG2, 0, 2544 F_ENABLETXPORTFROMDA | F_ENABLERXPORTFROMADDR); --- 422 unchanged lines hidden (view full) --- 2967 if (kbps > 0) { 2968 kbps *= 125; /* -> bytes */ 2969 for (cpt = 1; cpt <= 255; cpt++) { 2970 tps = clk / cpt; 2971 bpt = (kbps + tps / 2) / tps; 2972 if (bpt > 0 && bpt <= 255) { 2973 v = bpt * tps; 2974 delta = v >= kbps ? v - kbps : kbps - v; | 2700 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT1, 0); 2701 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT0, 0); 2702 t3_write_reg(adap, A_TP_MOD_CHANNEL_WEIGHT, 0); 2703 t3_write_reg(adap, A_TP_MOD_RATE_LIMIT, 0xf2200000); 2704 2705 if (adap->params.nports > 2) { 2706 t3_set_reg_field(adap, A_TP_PC_CONFIG2, 0, 2707 F_ENABLETXPORTFROMDA | F_ENABLERXPORTFROMADDR); --- 422 unchanged lines hidden (view full) --- 3130 if (kbps > 0) { 3131 kbps *= 125; /* -> bytes */ 3132 for (cpt = 1; cpt <= 255; cpt++) { 3133 tps = clk / cpt; 3134 bpt = (kbps + tps / 2) / tps; 3135 if (bpt > 0 && bpt <= 255) { 3136 v = bpt * tps; 3137 delta = v >= kbps ? v - kbps : kbps - v; |
2975 if (delta <= mindelta) { | 3138 if (delta < mindelta) { |
2976 mindelta = delta; 2977 selected_cpt = cpt; 2978 selected_bpt = bpt; 2979 } 2980 } else if (selected_cpt) 2981 break; 2982 } 2983 if (!selected_cpt) --- 394 unchanged lines hidden (view full) --- 3378 else 3379 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1, V_ACKLAT(M_ACKLAT), 3380 V_ACKLAT(acklat)); 3381 3382 t3_set_reg_field(adap, A_PCIE_PEX_CTRL0, V_REPLAYLMT(M_REPLAYLMT), 3383 V_REPLAYLMT(rpllmt)); 3384 3385 t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff); | 3139 mindelta = delta; 3140 selected_cpt = cpt; 3141 selected_bpt = bpt; 3142 } 3143 } else if (selected_cpt) 3144 break; 3145 } 3146 if (!selected_cpt) --- 394 unchanged lines hidden (view full) --- 3541 else 3542 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1, V_ACKLAT(M_ACKLAT), 3543 V_ACKLAT(acklat)); 3544 3545 t3_set_reg_field(adap, A_PCIE_PEX_CTRL0, V_REPLAYLMT(M_REPLAYLMT), 3546 V_REPLAYLMT(rpllmt)); 3547 3548 t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff); |
3386 t3_set_reg_field(adap, A_PCIE_CFG, F_PCIE_CLIDECEN, F_PCIE_CLIDECEN); | 3549 t3_set_reg_field(adap, A_PCIE_CFG, 0, 3550 F_PCIE_DMASTOPEN | F_PCIE_CLIDECEN); |
3387} 3388 3389/** 3390 * t3_init_hw - initialize and configure T3 HW modules 3391 * @adapter: the adapter 3392 * @fw_params: initial parameters to pass to firmware (optional) 3393 * 3394 * Initialize and configure T3 HW modules. This performs the 3395 * initialization steps that need to be done once after a card is reset. 3396 * MAC and PHY initialization is handled separarely whenever a port is 3397 * enabled. 3398 * 3399 * @fw_params are passed to FW and their value is platform dependent. 3400 * Only the top 8 bits are available for use, the rest must be 0. 3401 */ 3402int t3_init_hw(adapter_t *adapter, u32 fw_params) 3403{ | 3551} 3552 3553/** 3554 * t3_init_hw - initialize and configure T3 HW modules 3555 * @adapter: the adapter 3556 * @fw_params: initial parameters to pass to firmware (optional) 3557 * 3558 * Initialize and configure T3 HW modules. This performs the 3559 * initialization steps that need to be done once after a card is reset. 3560 * MAC and PHY initialization is handled separarely whenever a port is 3561 * enabled. 3562 * 3563 * @fw_params are passed to FW and their value is platform dependent. 3564 * Only the top 8 bits are available for use, the rest must be 0. 3565 */ 3566int t3_init_hw(adapter_t *adapter, u32 fw_params) 3567{ |
3404 int err = -EIO, attempts = 100; | 3568 int err = -EIO, attempts, i; |
3405 const struct vpd_params *vpd = &adapter->params.vpd; 3406 3407 if (adapter->params.rev > 0) 3408 calibrate_xgm_t3b(adapter); 3409 else if (calibrate_xgm(adapter)) 3410 goto out_err; 3411 3412 if (adapter->params.nports > 2) --- 4 unchanged lines hidden (view full) --- 3417 3418 if (mc7_init(&adapter->pmrx, vpd->mclk, vpd->mem_timing) || 3419 mc7_init(&adapter->pmtx, vpd->mclk, vpd->mem_timing) || 3420 mc7_init(&adapter->cm, vpd->mclk, vpd->mem_timing) || 3421 t3_mc5_init(&adapter->mc5, adapter->params.mc5.nservers, 3422 adapter->params.mc5.nfilters, 3423 adapter->params.mc5.nroutes)) 3424 goto out_err; | 3569 const struct vpd_params *vpd = &adapter->params.vpd; 3570 3571 if (adapter->params.rev > 0) 3572 calibrate_xgm_t3b(adapter); 3573 else if (calibrate_xgm(adapter)) 3574 goto out_err; 3575 3576 if (adapter->params.nports > 2) --- 4 unchanged lines hidden (view full) --- 3581 3582 if (mc7_init(&adapter->pmrx, vpd->mclk, vpd->mem_timing) || 3583 mc7_init(&adapter->pmtx, vpd->mclk, vpd->mem_timing) || 3584 mc7_init(&adapter->cm, vpd->mclk, vpd->mem_timing) || 3585 t3_mc5_init(&adapter->mc5, adapter->params.mc5.nservers, 3586 adapter->params.mc5.nfilters, 3587 adapter->params.mc5.nroutes)) 3588 goto out_err; |
3589 3590 for (i = 0; i < 32; i++) 3591 if (clear_sge_ctxt(adapter, i, F_CQ)) 3592 goto out_err; |
|
3425 } 3426 3427 if (tp_init(adapter, &adapter->params.tp)) 3428 goto out_err; 3429 3430#ifdef CONFIG_CHELSIO_T3_CORE 3431 t3_tp_set_coalescing_size(adapter, 3432 min(adapter->params.sge.max_pkt_size, 3433 MAX_RX_COALESCING_LEN), 1); 3434 t3_tp_set_max_rxsize(adapter, 3435 min(adapter->params.sge.max_pkt_size, 16384U)); 3436 ulp_config(adapter, &adapter->params.tp); 3437#endif 3438 if (is_pcie(adapter)) 3439 config_pcie(adapter); 3440 else | 3593 } 3594 3595 if (tp_init(adapter, &adapter->params.tp)) 3596 goto out_err; 3597 3598#ifdef CONFIG_CHELSIO_T3_CORE 3599 t3_tp_set_coalescing_size(adapter, 3600 min(adapter->params.sge.max_pkt_size, 3601 MAX_RX_COALESCING_LEN), 1); 3602 t3_tp_set_max_rxsize(adapter, 3603 min(adapter->params.sge.max_pkt_size, 16384U)); 3604 ulp_config(adapter, &adapter->params.tp); 3605#endif 3606 if (is_pcie(adapter)) 3607 config_pcie(adapter); 3608 else |
3441 t3_set_reg_field(adapter, A_PCIX_CFG, 0, F_CLIDECEN); | 3609 t3_set_reg_field(adapter, A_PCIX_CFG, 0, 3610 F_DMASTOPEN | F_CLIDECEN); |
3442 | 3611 |
3612 if (adapter->params.rev == T3_REV_C) 3613 t3_set_reg_field(adapter, A_ULPTX_CONFIG, 0, 3614 F_CFG_CQE_SOP_MASK); 3615 |
|
3443 t3_write_reg(adapter, A_PM1_RX_CFG, 0xffffffff); 3444 t3_write_reg(adapter, A_PM1_RX_MODE, 0); 3445 t3_write_reg(adapter, A_PM1_TX_MODE, 0); 3446 chan_init_hw(adapter, adapter->params.chan_map); 3447 t3_sge_init(adapter, &adapter->params.sge); 3448 3449 t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, vpd->uclk | fw_params); 3450 t3_write_reg(adapter, A_CIM_BOOT_CFG, 3451 V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2)); 3452 (void) t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */ 3453 | 3616 t3_write_reg(adapter, A_PM1_RX_CFG, 0xffffffff); 3617 t3_write_reg(adapter, A_PM1_RX_MODE, 0); 3618 t3_write_reg(adapter, A_PM1_TX_MODE, 0); 3619 chan_init_hw(adapter, adapter->params.chan_map); 3620 t3_sge_init(adapter, &adapter->params.sge); 3621 3622 t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, vpd->uclk | fw_params); 3623 t3_write_reg(adapter, A_CIM_BOOT_CFG, 3624 V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2)); 3625 (void) t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */ 3626 |
3627 attempts = 100; |
|
3454 do { /* wait for uP to initialize */ 3455 msleep(20); 3456 } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts); 3457 if (!attempts) { 3458 CH_ERR(adapter, "uP initialization timed out\n"); 3459 goto out_err; 3460 } 3461 --- 134 unchanged lines hidden (view full) --- 3596 3 : 2); 3597 3598 mi1_init(adapter, ai); 3599 t3_write_reg(adapter, A_I2C_CFG, /* set for 80KHz */ 3600 V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1)); 3601 t3_write_reg(adapter, A_T3DBG_GPIO_EN, 3602 ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL); 3603 t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0); | 3628 do { /* wait for uP to initialize */ 3629 msleep(20); 3630 } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts); 3631 if (!attempts) { 3632 CH_ERR(adapter, "uP initialization timed out\n"); 3633 goto out_err; 3634 } 3635 --- 134 unchanged lines hidden (view full) --- 3770 3 : 2); 3771 3772 mi1_init(adapter, ai); 3773 t3_write_reg(adapter, A_I2C_CFG, /* set for 80KHz */ 3774 V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1)); 3775 t3_write_reg(adapter, A_T3DBG_GPIO_EN, 3776 ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL); 3777 t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0); |
3778 t3_write_reg(adapter, A_SG_OCO_BASE, V_BASE1(0xfff)); |
|
3604 3605 if (adapter->params.rev == 0 || !uses_xaui(adapter)) 3606 val |= F_ENRGMII; 3607 3608 /* Enable MAC clocks so we can access the registers */ 3609 t3_write_reg(adapter, A_XGM_PORT_CFG, val); 3610 (void) t3_read_reg(adapter, A_XGM_PORT_CFG); 3611 --- 34 unchanged lines hidden (view full) --- 3646 if (devid != 0x1425) 3647 return -1; 3648 3649 if (save_and_restore_pcie) 3650 t3_os_pci_restore_state(adapter); 3651 return 0; 3652} 3653 | 3779 3780 if (adapter->params.rev == 0 || !uses_xaui(adapter)) 3781 val |= F_ENRGMII; 3782 3783 /* Enable MAC clocks so we can access the registers */ 3784 t3_write_reg(adapter, A_XGM_PORT_CFG, val); 3785 (void) t3_read_reg(adapter, A_XGM_PORT_CFG); 3786 --- 34 unchanged lines hidden (view full) --- 3821 if (devid != 0x1425) 3822 return -1; 3823 3824 if (save_and_restore_pcie) 3825 t3_os_pci_restore_state(adapter); 3826 return 0; 3827} 3828 |
3829static int __devinit init_parity(adapter_t *adap) 3830{ 3831 int i, err, addr; 3832 3833 if (t3_read_reg(adap, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY) 3834 return -EBUSY; 3835 3836 for (err = i = 0; !err && i < 16; i++) 3837 err = clear_sge_ctxt(adap, i, F_EGRESS); 3838 for (i = 0xfff0; !err && i <= 0xffff; i++) 3839 err = clear_sge_ctxt(adap, i, F_EGRESS); 3840 for (i = 0; !err && i < SGE_QSETS; i++) 3841 err = clear_sge_ctxt(adap, i, F_RESPONSEQ); 3842 if (err) 3843 return err; 3844 3845 t3_write_reg(adap, A_CIM_IBQ_DBG_DATA, 0); 3846 for (i = 0; i < 4; i++) 3847 for (addr = 0; addr <= M_IBQDBGADDR; addr++) { 3848 t3_write_reg(adap, A_CIM_IBQ_DBG_CFG, F_IBQDBGEN | 3849 F_IBQDBGWR | V_IBQDBGQID(i) | 3850 V_IBQDBGADDR(addr)); 3851 err = t3_wait_op_done(adap, A_CIM_IBQ_DBG_CFG, 3852 F_IBQDBGBUSY, 0, 2, 1); 3853 if (err) 3854 return err; 3855 } 3856 return 0; 3857} 3858 |
|
3654/** 3655 * t3_prep_adapter - prepare SW and HW for operation 3656 * @adapter: the adapter 3657 * @ai: contains information about the adapter type and properties 3658 * 3659 * Initialize adapter SW state for the various HW modules, set initial 3660 * values for some adapter tunables, take PHYs out of reset, and 3661 * initialize the MDIO interface. --- 65 unchanged lines hidden (view full) --- 3727 3728#ifdef CONFIG_CHELSIO_T3_CORE 3729 init_mtus(adapter->params.mtus); 3730 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd); 3731#endif 3732 } 3733 3734 early_hw_init(adapter, ai); | 3859/** 3860 * t3_prep_adapter - prepare SW and HW for operation 3861 * @adapter: the adapter 3862 * @ai: contains information about the adapter type and properties 3863 * 3864 * Initialize adapter SW state for the various HW modules, set initial 3865 * values for some adapter tunables, take PHYs out of reset, and 3866 * initialize the MDIO interface. --- 65 unchanged lines hidden (view full) --- 3932 3933#ifdef CONFIG_CHELSIO_T3_CORE 3934 init_mtus(adapter->params.mtus); 3935 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd); 3936#endif 3937 } 3938 3939 early_hw_init(adapter, ai); |
3940 ret = init_parity(adapter); 3941 if (ret) 3942 return ret; |
|
3735 3736 if (adapter->params.nports > 2 && 3737 (ret = t3_vsc7323_init(adapter, adapter->params.nports))) 3738 return ret; 3739 3740 for_each_port(adapter, i) { 3741 u8 hw_addr[6]; | 3943 3944 if (adapter->params.nports > 2 && 3945 (ret = t3_vsc7323_init(adapter, adapter->params.nports))) 3946 return ret; 3947 3948 for_each_port(adapter, i) { 3949 u8 hw_addr[6]; |
3950 const struct port_type_info *pti; |
|
3742 struct port_info *p = adap2pinfo(adapter, i); 3743 3744 while (!adapter->params.vpd.port_type[j]) 3745 ++j; 3746 | 3951 struct port_info *p = adap2pinfo(adapter, i); 3952 3953 while (!adapter->params.vpd.port_type[j]) 3954 ++j; 3955 |
3747 p->port_type = &port_types[adapter->params.vpd.port_type[j]]; 3748 p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j, 3749 ai->mdio_ops); | 3956 pti = &port_types[adapter->params.vpd.port_type[j]]; 3957 ret = pti->phy_prep(&p->phy, adapter, ai->phy_base_addr + j, 3958 ai->mdio_ops); 3959 if (ret) 3960 return ret; |
3750 mac_prep(&p->mac, adapter, j); 3751 ++j; 3752 3753 /* 3754 * The VPD EEPROM stores the base Ethernet address for the 3755 * card. A port's address is derived from the base by adding 3756 * the port's index to the base's low octet. 3757 */ 3758 memcpy(hw_addr, adapter->params.vpd.eth_base, 5); 3759 hw_addr[5] = adapter->params.vpd.eth_base[5] + i; 3760 3761 t3_os_set_hw_addr(adapter, i, hw_addr); | 3961 mac_prep(&p->mac, adapter, j); 3962 ++j; 3963 3964 /* 3965 * The VPD EEPROM stores the base Ethernet address for the 3966 * card. A port's address is derived from the base by adding 3967 * the port's index to the base's low octet. 3968 */ 3969 memcpy(hw_addr, adapter->params.vpd.eth_base, 5); 3970 hw_addr[5] = adapter->params.vpd.eth_base[5] + i; 3971 3972 t3_os_set_hw_addr(adapter, i, hw_addr); |
3762 init_link_config(&p->link_config, p->port_type->caps); | 3973 init_link_config(&p->link_config, p->phy.caps); |
3763 p->phy.ops->power_down(&p->phy, 1); | 3974 p->phy.ops->power_down(&p->phy, 1); |
3764 if (!(p->port_type->caps & SUPPORTED_IRQ)) | 3975 if (!(p->phy.caps & SUPPORTED_IRQ)) |
3765 adapter->params.linkpoll_period = 10; 3766 } 3767 3768 return 0; 3769} 3770 3771void t3_led_ready(adapter_t *adapter) 3772{ --- 24 unchanged lines hidden --- | 3976 adapter->params.linkpoll_period = 10; 3977 } 3978 3979 return 0; 3980} 3981 3982void t3_led_ready(adapter_t *adapter) 3983{ --- 24 unchanged lines hidden --- |