diff options
author | Divy Le Ray <divy@chelsio.com> | 2009-07-07 15:49:09 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-07-08 13:54:24 -0400 |
commit | 2e8c07c35b3ffee7689406be61fd1448ee45d3cd (patch) | |
tree | ad90ee33b8c13f48c7b330b8cf474e520d32fb50 /drivers/net/cxgb3/cxgb3_main.c | |
parent | 5e659515569220701bfe3c8936dcab67554cc286 (diff) |
cxgb3: use request_firmware() for the EDC registers setup
use request_firmware() to load the phy's EDC programmation
Signed-off-by: Divy Le Ray <divy@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cxgb3/cxgb3_main.c')
-rw-r--r-- | drivers/net/cxgb3/cxgb3_main.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 538dda4422dc..27e7ef592b59 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -964,6 +964,75 @@ static int bind_qsets(struct adapter *adap) | |||
964 | 964 | ||
965 | #define FW_FNAME "cxgb3/t3fw-%d.%d.%d.bin" | 965 | #define FW_FNAME "cxgb3/t3fw-%d.%d.%d.bin" |
966 | #define TPSRAM_NAME "cxgb3/t3%c_psram-%d.%d.%d.bin" | 966 | #define TPSRAM_NAME "cxgb3/t3%c_psram-%d.%d.%d.bin" |
967 | #define AEL2005_OPT_EDC_NAME "cxgb3/ael2005_opt_edc.bin" | ||
968 | #define AEL2005_TWX_EDC_NAME "cxgb3/ael2005_twx_edc.bin" | ||
969 | #define AEL2020_TWX_EDC_NAME "cxgb3/ael2005_twx_edc.bin" | ||
970 | |||
971 | static inline const char *get_edc_fw_name(int edc_idx) | ||
972 | { | ||
973 | const char *fw_name = NULL; | ||
974 | |||
975 | switch (edc_idx) { | ||
976 | case EDC_OPT_AEL2005: | ||
977 | fw_name = AEL2005_OPT_EDC_NAME; | ||
978 | break; | ||
979 | case EDC_TWX_AEL2005: | ||
980 | fw_name = AEL2005_TWX_EDC_NAME; | ||
981 | break; | ||
982 | case EDC_TWX_AEL2020: | ||
983 | fw_name = AEL2020_TWX_EDC_NAME; | ||
984 | break; | ||
985 | } | ||
986 | return fw_name; | ||
987 | } | ||
988 | |||
989 | int t3_get_edc_fw(struct cphy *phy, int edc_idx, int size) | ||
990 | { | ||
991 | struct adapter *adapter = phy->adapter; | ||
992 | const struct firmware *fw; | ||
993 | char buf[64]; | ||
994 | u32 csum; | ||
995 | const __be32 *p; | ||
996 | u16 *cache = phy->phy_cache; | ||
997 | int i, ret; | ||
998 | |||
999 | snprintf(buf, sizeof(buf), get_edc_fw_name(edc_idx)); | ||
1000 | |||
1001 | ret = request_firmware(&fw, buf, &adapter->pdev->dev); | ||
1002 | if (ret < 0) { | ||
1003 | dev_err(&adapter->pdev->dev, | ||
1004 | "could not upgrade firmware: unable to load %s\n", | ||
1005 | buf); | ||
1006 | return ret; | ||
1007 | } | ||
1008 | |||
1009 | /* check size, take checksum in account */ | ||
1010 | if (fw->size > size + 4) { | ||
1011 | CH_ERR(adapter, "firmware image too large %u, expected %d\n", | ||
1012 | (unsigned int)fw->size, size + 4); | ||
1013 | ret = -EINVAL; | ||
1014 | } | ||
1015 | |||
1016 | /* compute checksum */ | ||
1017 | p = (const __be32 *)fw->data; | ||
1018 | for (csum = 0, i = 0; i < fw->size / sizeof(csum); i++) | ||
1019 | csum += ntohl(p[i]); | ||
1020 | |||
1021 | if (csum != 0xffffffff) { | ||
1022 | CH_ERR(adapter, "corrupted firmware image, checksum %u\n", | ||
1023 | csum); | ||
1024 | ret = -EINVAL; | ||
1025 | } | ||
1026 | |||
1027 | for (i = 0; i < size / 4 ; i++) { | ||
1028 | *cache++ = (be32_to_cpu(p[i]) & 0xffff0000) >> 16; | ||
1029 | *cache++ = be32_to_cpu(p[i]) & 0xffff; | ||
1030 | } | ||
1031 | |||
1032 | release_firmware(fw); | ||
1033 | |||
1034 | return ret; | ||
1035 | } | ||
967 | 1036 | ||
968 | static int upgrade_fw(struct adapter *adap) | 1037 | static int upgrade_fw(struct adapter *adap) |
969 | { | 1038 | { |