aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/cxgb3/cxgb3_main.c
diff options
context:
space:
mode:
authorDivy Le Ray <divy@chelsio.com>2009-07-07 15:49:09 -0400
committerDavid S. Miller <davem@davemloft.net>2009-07-08 13:54:24 -0400
commit2e8c07c35b3ffee7689406be61fd1448ee45d3cd (patch)
treead90ee33b8c13f48c7b330b8cf474e520d32fb50 /drivers/net/cxgb3/cxgb3_main.c
parent5e659515569220701bfe3c8936dcab67554cc286 (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.c69
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
971static 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
989int 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
968static int upgrade_fw(struct adapter *adap) 1037static int upgrade_fw(struct adapter *adap)
969{ 1038{