diff options
author | Pratik Pujar <pratik.pujar@qlogic.com> | 2013-08-30 13:51:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-31 22:34:44 -0400 |
commit | 7000078aabd662fd7f5da0ae09b4b02387a83ba6 (patch) | |
tree | 47a00283549462fc738ba74f79e66084f1963efb | |
parent | 9ce226fa2352eac89ce79abdea8e465c680d1db0 (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>
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 | ||
275 | struct qlc_83xx_fw_info { | 275 | struct 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 | ||
284 | struct qlc_83xx_reset { | 280 | struct 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 | ||
1268 | static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter) | 1268 | static 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 | ||
1952 | static 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 | |||
1974 | static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter) | 1954 | static 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 | ||
2155 | static 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 | |||
2176 | int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) | 2188 | int 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: | |||
2242 | disable_intr: | 2258 | disable_intr: |
2243 | qlcnic_teardown_intr(adapter); | 2259 | qlcnic_teardown_intr(adapter); |
2244 | 2260 | ||
2261 | clear_fw_info: | ||
2262 | kfree(ahw->fw_info); | ||
2263 | |||
2245 | detach_mbx: | 2264 | detach_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); |