aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPratik Pujar <pratik.pujar@qlogic.com>2013-08-30 13:51:22 -0400
committerDavid S. Miller <davem@davemloft.net>2013-08-31 22:34:44 -0400
commit7000078aabd662fd7f5da0ae09b4b02387a83ba6 (patch)
tree47a00283549462fc738ba74f79e66084f1963efb
parent9ce226fa2352eac89ce79abdea8e465c680d1db0 (diff)
qlcnic: Restructuring of qlc_83xx_fw_info structure.
o Removed unused and unnecessary members from qlc_83xx_fw_info structure. o Made fw_info member of qlcnic_hardware_context as a pointer to qlc_83xx_fw_info structure. o Added a member fw_file_name to qlc_83xx_fw_info structure which will hold the name of firmware image file name. Signed-off-by: Pratik Pujar <pratik.pujar@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h6
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c97
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c1
4 files changed, 61 insertions, 45 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 318663f91b5e..204d6e1db828 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -463,7 +463,7 @@ struct qlcnic_hardware_context {
463 struct qlcnic_fdt fdt; 463 struct qlcnic_fdt fdt;
464 struct qlc_83xx_reset reset; 464 struct qlc_83xx_reset reset;
465 struct qlc_83xx_idc idc; 465 struct qlc_83xx_idc idc;
466 struct qlc_83xx_fw_info fw_info; 466 struct qlc_83xx_fw_info *fw_info;
467 struct qlcnic_intrpt_config *intr_tbl; 467 struct qlcnic_intrpt_config *intr_tbl;
468 struct qlcnic_sriov *sriov; 468 struct qlcnic_sriov *sriov;
469 u32 *reg_tbl; 469 u32 *reg_tbl;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index 6752d5890b24..2a2ab6b83337 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -274,11 +274,7 @@ struct qlcnic_macvlan_mbx {
274 274
275struct qlc_83xx_fw_info { 275struct qlc_83xx_fw_info {
276 const struct firmware *fw; 276 const struct firmware *fw;
277 u16 major_fw_version; 277 char fw_file_name[QLC_FW_FILE_NAME_LEN];
278 u8 minor_fw_version;
279 u8 sub_fw_version;
280 u8 fw_build_num;
281 u8 load_from_file;
282}; 278};
283 279
284struct qlc_83xx_reset { 280struct qlc_83xx_reset {
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index b7eddfe74d8c..c24c2a4ca7e8 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -1267,31 +1267,33 @@ static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter)
1267 1267
1268static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter) 1268static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
1269{ 1269{
1270 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
1271 const struct firmware *fw = fw_info->fw;
1270 u32 dest, *p_cache; 1272 u32 dest, *p_cache;
1271 u64 addr; 1273 int i, ret = -EIO;
1272 u8 data[16]; 1274 u8 data[16];
1273 size_t size; 1275 size_t size;
1274 int i, ret = -EIO; 1276 u64 addr;
1275 1277
1276 dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR); 1278 dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
1277 size = (adapter->ahw->fw_info.fw->size & ~0xF); 1279 size = (fw->size & ~0xF);
1278 p_cache = (u32 *)adapter->ahw->fw_info.fw->data; 1280 p_cache = (u32 *)fw->data;
1279 addr = (u64)dest; 1281 addr = (u64)dest;
1280 1282
1281 ret = qlcnic_83xx_ms_mem_write128(adapter, addr, 1283 ret = qlcnic_83xx_ms_mem_write128(adapter, addr,
1282 (u32 *)p_cache, size / 16); 1284 (u32 *)p_cache, size / 16);
1283 if (ret) { 1285 if (ret) {
1284 dev_err(&adapter->pdev->dev, "MS memory write failed\n"); 1286 dev_err(&adapter->pdev->dev, "MS memory write failed\n");
1285 release_firmware(adapter->ahw->fw_info.fw); 1287 release_firmware(fw);
1286 adapter->ahw->fw_info.fw = NULL; 1288 fw_info->fw = NULL;
1287 return -EIO; 1289 return -EIO;
1288 } 1290 }
1289 1291
1290 /* alignment check */ 1292 /* alignment check */
1291 if (adapter->ahw->fw_info.fw->size & 0xF) { 1293 if (fw->size & 0xF) {
1292 addr = dest + size; 1294 addr = dest + size;
1293 for (i = 0; i < (adapter->ahw->fw_info.fw->size & 0xF); i++) 1295 for (i = 0; i < (fw->size & 0xF); i++)
1294 data[i] = adapter->ahw->fw_info.fw->data[size + i]; 1296 data[i] = fw->data[size + i];
1295 for (; i < 16; i++) 1297 for (; i < 16; i++)
1296 data[i] = 0; 1298 data[i] = 0;
1297 ret = qlcnic_83xx_ms_mem_write128(adapter, addr, 1299 ret = qlcnic_83xx_ms_mem_write128(adapter, addr,
@@ -1299,13 +1301,13 @@ static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
1299 if (ret) { 1301 if (ret) {
1300 dev_err(&adapter->pdev->dev, 1302 dev_err(&adapter->pdev->dev,
1301 "MS memory write failed\n"); 1303 "MS memory write failed\n");
1302 release_firmware(adapter->ahw->fw_info.fw); 1304 release_firmware(fw);
1303 adapter->ahw->fw_info.fw = NULL; 1305 fw_info->fw = NULL;
1304 return -EIO; 1306 return -EIO;
1305 } 1307 }
1306 } 1308 }
1307 release_firmware(adapter->ahw->fw_info.fw); 1309 release_firmware(fw);
1308 adapter->ahw->fw_info.fw = NULL; 1310 fw_info->fw = NULL;
1309 1311
1310 return 0; 1312 return 0;
1311} 1313}
@@ -1949,35 +1951,12 @@ static void qlcnic_83xx_init_hw(struct qlcnic_adapter *p_dev)
1949 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__); 1951 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
1950} 1952}
1951 1953
1952static void qlcnic_83xx_get_fw_file_name(struct qlcnic_adapter *adapter,
1953 char *file_name)
1954{
1955 struct pci_dev *pdev = adapter->pdev;
1956
1957 memset(file_name, 0, QLC_FW_FILE_NAME_LEN);
1958
1959 switch (pdev->device) {
1960 case PCI_DEVICE_ID_QLOGIC_QLE834X:
1961 strncpy(file_name, QLC_83XX_FW_FILE_NAME,
1962 QLC_FW_FILE_NAME_LEN);
1963 break;
1964 case PCI_DEVICE_ID_QLOGIC_QLE844X:
1965 strncpy(file_name, QLC_84XX_FW_FILE_NAME,
1966 QLC_FW_FILE_NAME_LEN);
1967 break;
1968 default:
1969 dev_err(&pdev->dev, "%s: Invalid device id\n",
1970 __func__);
1971 }
1972}
1973
1974static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter) 1954static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
1975{ 1955{
1976 char fw_file_name[QLC_FW_FILE_NAME_LEN]; 1956 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
1977 int err = -EIO; 1957 int err = -EIO;
1978 1958
1979 qlcnic_83xx_get_fw_file_name(adapter, fw_file_name); 1959 if (request_firmware(&fw_info->fw, fw_info->fw_file_name,
1980 if (request_firmware(&adapter->ahw->fw_info.fw, fw_file_name,
1981 &(adapter->pdev->dev))) { 1960 &(adapter->pdev->dev))) {
1982 dev_err(&adapter->pdev->dev, 1961 dev_err(&adapter->pdev->dev,
1983 "No file FW image, loading flash FW image.\n"); 1962 "No file FW image, loading flash FW image.\n");
@@ -2173,6 +2152,39 @@ static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
2173 } 2152 }
2174} 2153}
2175 2154
2155static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
2156{
2157 struct qlcnic_hardware_context *ahw = adapter->ahw;
2158 struct pci_dev *pdev = adapter->pdev;
2159 struct qlc_83xx_fw_info *fw_info;
2160 int err = 0;
2161
2162 ahw->fw_info = kzalloc(sizeof(*fw_info), GFP_KERNEL);
2163 if (!ahw->fw_info) {
2164 err = -ENOMEM;
2165 } else {
2166 fw_info = ahw->fw_info;
2167 switch (pdev->device) {
2168 case PCI_DEVICE_ID_QLOGIC_QLE834X:
2169 strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME,
2170 QLC_FW_FILE_NAME_LEN);
2171 break;
2172 case PCI_DEVICE_ID_QLOGIC_QLE844X:
2173 strncpy(fw_info->fw_file_name, QLC_84XX_FW_FILE_NAME,
2174 QLC_FW_FILE_NAME_LEN);
2175 break;
2176 default:
2177 dev_err(&pdev->dev, "%s: Invalid device id\n",
2178 __func__);
2179 err = -EINVAL;
2180 break;
2181 }
2182 }
2183
2184 return err;
2185}
2186
2187
2176int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) 2188int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
2177{ 2189{
2178 struct qlcnic_hardware_context *ahw = adapter->ahw; 2190 struct qlcnic_hardware_context *ahw = adapter->ahw;
@@ -2198,10 +2210,14 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
2198 if (!qlcnic_83xx_read_flash_descriptor_table(adapter)) 2210 if (!qlcnic_83xx_read_flash_descriptor_table(adapter))
2199 qlcnic_83xx_read_flash_mfg_id(adapter); 2211 qlcnic_83xx_read_flash_mfg_id(adapter);
2200 2212
2201 err = qlcnic_83xx_idc_init(adapter); 2213 err = qlcnic_83xx_get_fw_info(adapter);
2202 if (err) 2214 if (err)
2203 goto detach_mbx; 2215 goto detach_mbx;
2204 2216
2217 err = qlcnic_83xx_idc_init(adapter);
2218 if (err)
2219 goto clear_fw_info;
2220
2205 err = qlcnic_setup_intr(adapter, 0, 0); 2221 err = qlcnic_setup_intr(adapter, 0, 0);
2206 if (err) { 2222 if (err) {
2207 dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n"); 2223 dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n");
@@ -2242,6 +2258,9 @@ disable_mbx_intr:
2242disable_intr: 2258disable_intr:
2243 qlcnic_teardown_intr(adapter); 2259 qlcnic_teardown_intr(adapter);
2244 2260
2261clear_fw_info:
2262 kfree(ahw->fw_info);
2263
2245detach_mbx: 2264detach_mbx:
2246 qlcnic_83xx_detach_mailbox_work(adapter); 2265 qlcnic_83xx_detach_mailbox_work(adapter);
2247 qlcnic_83xx_free_mailbox(ahw->mailbox); 2266 qlcnic_83xx_free_mailbox(ahw->mailbox);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index b1046c3b68d2..2097d3442d7f 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2402,6 +2402,7 @@ static void qlcnic_remove(struct pci_dev *pdev)
2402 qlcnic_83xx_free_mbx_intr(adapter); 2402 qlcnic_83xx_free_mbx_intr(adapter);
2403 qlcnic_83xx_detach_mailbox_work(adapter); 2403 qlcnic_83xx_detach_mailbox_work(adapter);
2404 qlcnic_83xx_free_mailbox(ahw->mailbox); 2404 qlcnic_83xx_free_mailbox(ahw->mailbox);
2405 kfree(ahw->fw_info);
2405 } 2406 }
2406 2407
2407 qlcnic_detach(adapter); 2408 qlcnic_detach(adapter);