History

qlcnic: Fix for flash update failure on 83xx adapter

Flash update routine was improperly checking register read API return value. Modify register read API and perform proper error check.

Himanshu Madhani committed 13 years ago

Commit 4bd8e731 parent b1f503710 files · +231 −132Browse files

Unified · Split

10 files
  1. drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +3 −9
  2. drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +60 −41
  3. drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +1 −1
  4. drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +61 −30
  5. drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c +5 −5
  6. drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +46 −17
  7. drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c +27 −13
  8. drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h +1 −1
  9. drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +17 −8
  10. drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +10 −7
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h+3−9
@@ -1400,8 +1400,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64); · 1399 unmodified lines
14001400 #define ADDR_IN_RANGE(addr, low, high) \
14011401 (((addr) < (high)) && ((addr) >= (low)))
14021402
1403−#define QLCRD32(adapter, off) \
1404− (adapter->ahw->hw_ops->read_reg)(adapter, off)
1403+#define QLCRD32(adapter, off, err) \
1404+ (adapter->ahw->hw_ops->read_reg)(adapter, off, err)
14051405
14061406 #define QLCWR32(adapter, off, val) \
14071407 adapter->ahw->hw_ops->write_reg(adapter, off, val)
@@ -1604,7 +1604,7 @@ struct qlcnic_nic_template { · 196 unmodified lines
16041604 struct qlcnic_hardware_ops {
16051605 void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
16061606 void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1607− int (*read_reg) (struct qlcnic_adapter *, ulong);
1607+ int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
16081608 int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
16091609 void (*get_ocm_win) (struct qlcnic_hardware_context *);
16101610 int (*get_mac_address) (struct qlcnic_adapter *, u8 *);
@@ -1662,12 +1662,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf, · 51 unmodified lines
16621662 adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
16631663 }
16641664
1665−static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter,
1666− ulong off)
1667−{
1668− return adapter->ahw->hw_ops->read_reg(adapter, off);
1669−}
1670−
16711665 static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
16721666 ulong off, u32 data)
16731667 {
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c+60−41
@@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr) · 227 unmodified lines
228228 return 0;
229229 }
230230
231−int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr)
231+int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
232+ int *err)
232233 {
233− int ret;
234234 struct qlcnic_hardware_context *ahw = adapter->ahw;
235235
236− ret = __qlcnic_set_win_base(adapter, (u32) addr);
237− if (!ret) {
236+ *err = __qlcnic_set_win_base(adapter, (u32) addr);
237+ if (!*err) {
238238 return QLCRDX(ahw, QLCNIC_WILDCARD);
239239 } else {
240240 dev_err(&adapter->pdev->dev,
241− "%s failed, addr = 0x%x\n", __func__, (int)addr);
241+ "%s failed, addr = 0x%lx\n", __func__, addr);
242242 return -EIO;
243243 }
244244 }
@@ -561,7 +561,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter) · 316 unmodified lines
561561 void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
562562 loff_t offset, size_t size)
563563 {
564− int ret;
564+ int ret = 0;
565565 u32 data;
566566
567567 if (qlcnic_api_lock(adapter)) {
@@ -571,7 +571,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, · 3 unmodified lines
571571 return;
572572 }
573573
574− ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset);
574+ data = QLCRD32(adapter, (u32) offset, &ret);
575575 qlcnic_api_unlock(adapter);
576576
577577 if (ret == -EIO) {
@@ -580,7 +580,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, · 2 unmodified lines
580580 __func__, (u32)offset);
581581 return;
582582 }
583− data = ret;
584583 memcpy(buf, &data, size);
585584 }
586585
@@ -2391,9 +2390,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, · 1804 unmodified lines
23912390 u32 flash_addr, u8 *p_data,
23922391 int count)
23932392 {
2394− int i, ret;
2395− u32 word, range, flash_offset, addr = flash_addr;
2393+ u32 word, range, flash_offset, addr = flash_addr, ret;
23962394 ulong indirect_add, direct_window;
2395+ int i, err = 0;
23972396
23982397 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1);
23992398 if (addr & 0x3) {
@@ -2411,10 +2410,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, · 11 unmodified lines
24112410 /* Multi sector read */
24122411 for (i = 0; i < count; i++) {
24132412 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
2414− ret = qlcnic_83xx_rd_reg_indirect(adapter,
2415− indirect_add);
2416− if (ret == -EIO)
2417− return -EIO;
2413+ ret = QLCRD32(adapter, indirect_add, &err);
2414+ if (err == -EIO)
2415+ return err;
24182416
24192417 word = ret;
24202418 *(u32 *)p_data = word;
@@ -2435,10 +2433,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, · 14 unmodified lines
24352433 /* Single sector read */
24362434 for (i = 0; i < count; i++) {
24372435 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
2438− ret = qlcnic_83xx_rd_reg_indirect(adapter,
2439− indirect_add);
2440− if (ret == -EIO)
2441− return -EIO;
2436+ ret = QLCRD32(adapter, indirect_add, &err);
2437+ if (err == -EIO)
2438+ return err;
24422439
24432440 word = ret;
24442441 *(u32 *)p_data = word;
@@ -2454,10 +2451,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter) · 9 unmodified lines
24542451 {
24552452 u32 status;
24562453 int retries = QLC_83XX_FLASH_READ_RETRY_COUNT;
2454+ int err = 0;
24572455
24582456 do {
2459− status = qlcnic_83xx_rd_reg_indirect(adapter,
2460− QLC_83XX_FLASH_STATUS);
2457+ status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err);
2458+ if (err == -EIO)
2459+ return err;
2460+
24612461 if ((status & QLC_83XX_FLASH_STATUS_READY) ==
24622462 QLC_83XX_FLASH_STATUS_READY)
24632463 break;
@@ -2509,7 +2509,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter) · 45 unmodified lines
25092509
25102510 int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
25112511 {
2512− int ret, mfg_id;
2512+ int ret, err = 0;
2513+ u32 mfg_id;
25132514
25142515 if (qlcnic_83xx_lock_flash(adapter))
25152516 return -EIO;
@@ -2524,9 +2525,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) · 8 unmodified lines
25242525 return -EIO;
25252526 }
25262527
2527− mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA);
2528− if (mfg_id == -EIO)
2529− return -EIO;
2528+ mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
2529+ if (err == -EIO) {
2530+ qlcnic_83xx_unlock_flash(adapter);
2531+ return err;
2532+ }
25302533
25312534 adapter->flash_mfg_id = (mfg_id & 0xFF);
25322535 qlcnic_83xx_unlock_flash(adapter);
@@ -2643,7 +2646,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, · 110 unmodified lines
26432646 u32 *p_data, int count)
26442647 {
26452648 u32 temp;
2646− int ret = -EIO;
2649+ int ret = -EIO, err = 0;
26472650
26482651 if ((count < QLC_83XX_FLASH_WRITE_MIN) ||
26492652 (count > QLC_83XX_FLASH_WRITE_MAX)) {
@@ -2652,8 +2655,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, · 2 unmodified lines
26522655 return -EIO;
26532656 }
26542657
2655− temp = qlcnic_83xx_rd_reg_indirect(adapter,
2656− QLC_83XX_FLASH_SPI_CONTROL);
2658+ temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2659+ if (err == -EIO)
2660+ return err;
2661+
26572662 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
26582663 (temp | QLC_83XX_FLASH_SPI_CTRL));
26592664 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
@@ -2702,13 +2707,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, · 42 unmodified lines
27022707 return -EIO;
27032708 }
27042709
2705− ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS);
2710+ ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err);
2711+ if (err == -EIO)
2712+ return err;
2713+
27062714 if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) {
27072715 dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
27082716 __func__, __LINE__);
27092717 /* Operation failed, clear error bit */
2710− temp = qlcnic_83xx_rd_reg_indirect(adapter,
2711− QLC_83XX_FLASH_SPI_CONTROL);
2718+ temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2719+ if (err == -EIO)
2720+ return err;
2721+
27122722 qlcnic_83xx_wrt_reg_indirect(adapter,
27132723 QLC_83XX_FLASH_SPI_CONTROL,
27142724 (temp | QLC_83XX_FLASH_SPI_CTRL));
@@ -2830,6 +2840,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, · 115 unmodified lines
28302840 {
28312841 int i, j, ret = 0;
28322842 u32 temp;
2843+ int err = 0;
28332844
28342845 /* Check alignment */
28352846 if (addr & 0xF)
@@ -2862,8 +2873,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, · 26 unmodified lines
28622873 QLCNIC_TA_WRITE_START);
28632874
28642875 for (j = 0; j < MAX_CTL_CHECK; j++) {
2865− temp = qlcnic_83xx_rd_reg_indirect(adapter,
2866− QLCNIC_MS_CTRL);
2876+ temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err);
2877+ if (err == -EIO) {
2878+ mutex_unlock(&adapter->ahw->mem_lock);
2879+ return err;
2880+ }
2881+
28672882 if ((temp & TA_CTL_BUSY) == 0)
28682883 break;
28692884 }
@@ -2885,9 +2900,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, · 15 unmodified lines
28852900 int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
28862901 u8 *p_data, int count)
28872902 {
2888− int i, ret;
2889− u32 word, addr = flash_addr;
2903+ u32 word, addr = flash_addr, ret;
28902904 ulong indirect_addr;
2905+ int i, err = 0;
28912906
28922907 if (qlcnic_83xx_lock_flash(adapter) != 0)
28932908 return -EIO;
@@ -2907,10 +2922,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, · 13 unmodified lines
29072922 }
29082923
29092924 indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
2910− ret = qlcnic_83xx_rd_reg_indirect(adapter,
2911− indirect_addr);
2912− if (ret == -EIO)
2913− return -EIO;
2925+ ret = QLCRD32(adapter, indirect_addr, &err);
2926+ if (err == -EIO)
2927+ return err;
2928+
29142929 word = ret;
29152930 *(u32 *)p_data = word;
29162931 p_data = p_data + 4;
@@ -3376,7 +3391,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter, · 459 unmodified lines
33763391
33773392 static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
33783393 {
3379− int ret;
3394+ int ret, err = 0;
3395+ u32 temp;
33803396
33813397 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
33823398 QLC_83XX_FLASH_OEM_READ_SIG);
@@ -3386,8 +3402,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) · 3 unmodified lines
33863402 if (ret)
33873403 return -EIO;
33883404
3389− ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA);
3390− return ret & 0xFF;
3405+ temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
3406+ if (err == -EIO)
3407+ return err;
3408+
3409+ return temp & 0xFF;
33913410 }
33923411
33933412 int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h+1−1
@@ -508,7 +508,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *); · 507 unmodified lines
508508 void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *);
509509 void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
510510 void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
511−int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong);
511+int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *);
512512 int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
513513 void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []);
514514 int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c+61−30
@@ -1303,8 +1303,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) · 1302 unmodified lines
13031303 {
13041304 int i, j;
13051305 u32 val = 0, val1 = 0, reg = 0;
1306+ int err = 0;
13061307
1307− val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG);
1308+ val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
1309+ if (err == -EIO)
1310+ return;
13081311 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
13091312
13101313 for (j = 0; j < 2; j++) {
@@ -1318,7 +1321,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) · 7 unmodified lines
13181321 reg = QLC_83XX_PORT1_THRESHOLD;
13191322 }
13201323 for (i = 0; i < 8; i++) {
1321− val = QLCRD32(adapter, reg + (i * 0x4));
1324+ val = QLCRD32(adapter, reg + (i * 0x4), &err);
1325+ if (err == -EIO)
1326+ return;
13221327 dev_info(&adapter->pdev->dev, "0x%x ", val);
13231328 }
13241329 dev_info(&adapter->pdev->dev, "\n");
@@ -1335,8 +1340,10 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) · 10 unmodified lines
13351340 reg = QLC_83XX_PORT1_TC_MC_REG;
13361341 }
13371342 for (i = 0; i < 4; i++) {
1338− val = QLCRD32(adapter, reg + (i * 0x4));
1339− dev_info(&adapter->pdev->dev, "0x%x ", val);
1343+ val = QLCRD32(adapter, reg + (i * 0x4), &err);
1344+ if (err == -EIO)
1345+ return;
1346+ dev_info(&adapter->pdev->dev, "0x%x ", val);
13401347 }
13411348 dev_info(&adapter->pdev->dev, "\n");
13421349 }
@@ -1352,17 +1359,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) · 9 unmodified lines
13521359 reg = QLC_83XX_PORT1_TC_STATS;
13531360 }
13541361 for (i = 7; i >= 0; i--) {
1355− val = QLCRD32(adapter, reg);
1362+ val = QLCRD32(adapter, reg, &err);
1363+ if (err == -EIO)
1364+ return;
13561365 val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
13571366 QLCWR32(adapter, reg, (val | (i << 29)));
1358− val = QLCRD32(adapter, reg);
1367+ val = QLCRD32(adapter, reg, &err);
1368+ if (err == -EIO)
1369+ return;
13591370 dev_info(&adapter->pdev->dev, "0x%x ", val);
13601371 }
13611372 dev_info(&adapter->pdev->dev, "\n");
13621373 }
13631374
1364− val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD);
1365− val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD);
1375+ val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
1376+ if (err == -EIO)
1377+ return;
1378+ val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
1379+ if (err == -EIO)
1380+ return;
13661381 dev_info(&adapter->pdev->dev,
13671382 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
13681383 val, val1);
@@ -1425,7 +1440,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter) · 56 unmodified lines
14251440 static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
14261441 {
14271442 u32 heartbeat, peg_status;
1428− int retries, ret = -EIO;
1443+ int retries, ret = -EIO, err = 0;
14291444
14301445 retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
14311446 p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
@@ -1453,11 +1468,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) · 21 unmodified lines
14531468 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
14541469 "PEG_NET_4_PC: 0x%x\n", peg_status,
14551470 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
1456− QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0),
1457− QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1),
1458− QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2),
1459− QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3),
1460− QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4));
1471+ QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
1472+ QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
1473+ QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
1474+ QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
1475+ QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
14611476
14621477 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
14631478 dev_err(&p_dev->pdev->dev,
@@ -1501,18 +1516,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev) · 37 unmodified lines
15011516 static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
15021517 int duration, u32 mask, u32 status)
15031518 {
1519+ int timeout_error, err = 0;
15041520 u32 value;
1505− int timeout_error;
15061521 u8 retries;
15071522
1508− value = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
1523+ value = QLCRD32(p_dev, addr, &err);
1524+ if (err == -EIO)
1525+ return err;
15091526 retries = duration / 10;
15101527
15111528 do {
15121529 if ((value & mask) != status) {
15131530 timeout_error = 1;
15141531 msleep(duration / 10);
1515− value = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
1532+ value = QLCRD32(p_dev, addr, &err);
1533+ if (err == -EIO)
1534+ return err;
15161535 } else {
15171536 timeout_error = 0;
15181537 break;
@@ -1606,9 +1625,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev) · 87 unmodified lines
16061625 static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
16071626 u32 raddr, u32 waddr)
16081627 {
1609− int value;
1628+ int err = 0;
1629+ u32 value;
16101630
1611− value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr);
1631+ value = QLCRD32(p_dev, raddr, &err);
1632+ if (err == -EIO)
1633+ return;
16121634 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
16131635 }
16141636
@@ -1617,12 +1639,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev, · 2 unmodified lines
16171639 u32 raddr, u32 waddr,
16181640 struct qlc_83xx_rmw *p_rmw_hdr)
16191641 {
1620− int value;
1642+ int err = 0;
1643+ u32 value;
16211644
1622− if (p_rmw_hdr->index_a)
1645+ if (p_rmw_hdr->index_a) {
16231646 value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
1624− else
1625− value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr);
1647+ } else {
1648+ value = QLCRD32(p_dev, raddr, &err);
1649+ if (err == -EIO)
1650+ return;
1651+ }
16261652
16271653 value &= p_rmw_hdr->mask;
16281654 value <<= p_rmw_hdr->shl;
@@ -1675,7 +1701,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev, · 46 unmodified lines
16751701 long delay;
16761702 struct qlc_83xx_entry *entry;
16771703 struct qlc_83xx_poll *poll;
1678− int i;
1704+ int i, err = 0;
16791705 unsigned long arg1, arg2;
16801706
16811707 poll = (struct qlc_83xx_poll *)((char *)p_hdr +
@@ -1699,10 +1725,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev, · 17 unmodified lines
16991725 arg1, delay,
17001726 poll->mask,
17011727 poll->status)){
1702− qlcnic_83xx_rd_reg_indirect(p_dev,
1703− arg1);
1704− qlcnic_83xx_rd_reg_indirect(p_dev,
1705− arg2);
1728+ QLCRD32(p_dev, arg1, &err);
1729+ if (err == -EIO)
1730+ return;
1731+ QLCRD32(p_dev, arg2, &err);
1732+ if (err == -EIO)
1733+ return;
17061734 }
17071735 }
17081736 }
@@ -1768,7 +1796,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev, · 59 unmodified lines
17681796 struct qlc_83xx_entry_hdr *p_hdr)
17691797 {
17701798 long delay;
1771− int index, i, j;
1799+ int index, i, j, err;
17721800 struct qlc_83xx_quad_entry *entry;
17731801 struct qlc_83xx_poll *poll;
17741802 unsigned long addr;
@@ -1788,7 +1816,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev, · 13 unmodified lines
17881816 poll->mask, poll->status)){
17891817 index = p_dev->ahw->reset.array_index;
17901818 addr = entry->dr_addr;
1791− j = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
1819+ j = QLCRD32(p_dev, addr, &err);
1820+ if (err == -EIO)
1821+ return;
1822+
17921823 p_dev->ahw->reset.array[index++] = j;
17931824
17941825 if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c+5−5
@@ -104,7 +104,7 @@ static u32 · 103 unmodified lines
104104 qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
105105 {
106106 u32 rsp;
107− int timeout = 0;
107+ int timeout = 0, err = 0;
108108
109109 do {
110110 /* give atleast 1ms for firmware to respond */
@@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter) · 2 unmodified lines
113113 if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT)
114114 return QLCNIC_CDRP_RSP_TIMEOUT;
115115
116− rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET);
116+ rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err);
117117 } while (!QLCNIC_CDRP_IS_RSP(rsp));
118118
119119 return rsp;
@@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter) · 2 unmodified lines
122122 int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
123123 struct qlcnic_cmd_args *cmd)
124124 {
125− int i;
125+ int i, err = 0;
126126 u32 rsp;
127127 u32 signature;
128128 struct pci_dev *pdev = adapter->pdev;
@@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, · 19 unmodified lines
148148 dev_err(&pdev->dev, "card response timeout.\n");
149149 cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
150150 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
151− cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
151+ cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err);
152152 switch (cmd->rsp.arg[0]) {
153153 case QLCNIC_RCODE_INVALID_ARGS:
154154 fmt = "CDRP invalid args: [%d]\n";
@@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, · 20 unmodified lines
175175 cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
176176
177177 for (i = 1; i < cmd->rsp.num; i++)
178− cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i));
178+ cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err);
179179
180180 /* Release semaphore */
181181 qlcnic_api_unlock(adapter);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c+46−17
@@ -267,7 +267,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, · 266 unmodified lines
267267 {
268268 struct qlcnic_hardware_context *ahw = adapter->ahw;
269269 u32 speed, reg;
270− int check_sfp_module = 0;
270+ int check_sfp_module = 0, err = 0;
271271 u16 pcifn = ahw->pci_func;
272272
273273 /* read which mode */
@@ -290,7 +290,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, · 16 unmodified lines
290290
291291 } else if (adapter->ahw->port_type == QLCNIC_XGBE) {
292292 u32 val = 0;
293− val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR);
293+ val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err);
294294
295295 if (val == QLCNIC_PORT_MODE_802_3_AP) {
296296 ecmd->supported = SUPPORTED_1000baseT_Full;
@@ -303,7 +303,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, · 6 unmodified lines
303303 if (netif_running(adapter->netdev) && ahw->has_link_events) {
304304 if (ahw->linkup) {
305305 reg = QLCRD32(adapter,
306− P3P_LINK_SPEED_REG(pcifn));
306+ P3P_LINK_SPEED_REG(pcifn), &err);
307307 speed = P3P_LINK_SPEED_VAL(pcifn, reg);
308308 ahw->link_speed = speed * P3P_LINK_SPEED_MHZ;
309309 }
@@ -468,13 +468,14 @@ static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) · 158 unmodified lines
468468 static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter,
469469 u32 *regs_buff)
470470 {
471− int i, j = 0;
471+ int i, j = 0, err = 0;
472472
473473 for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++)
474474 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]);
475475 j = 0;
476476 while (ext_diag_registers[j] != -1)
477− regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++]);
477+ regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++],
478+ &err);
478479 return i;
479480 }
480481
@@ -524,13 +525,16 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) · 43 unmodified lines
524525 static u32 qlcnic_test_link(struct net_device *dev)
525526 {
526527 struct qlcnic_adapter *adapter = netdev_priv(dev);
528+ int err = 0;
527529 u32 val;
528530
529531 if (qlcnic_83xx_check(adapter)) {
530532 val = qlcnic_83xx_test_link(adapter);
531533 return (val & 1) ? 0 : 1;
532534 }
533− val = QLCRD32(adapter, CRB_XG_STATE_P3P);
535+ val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err);
536+ if (err == -EIO)
537+ return err;
534538 val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val);
535539 return (val == XG_LINK_UP_P3P) ? 0 : 1;
536540 }
@@ -663,6 +667,7 @@ qlcnic_get_pauseparam(struct net_device *netdev, · 126 unmodified lines
663667 {
664668 struct qlcnic_adapter *adapter = netdev_priv(netdev);
665669 int port = adapter->ahw->physical_port;
670+ int err = 0;
666671 __u32 val;
667672
668673 if (qlcnic_83xx_check(adapter)) {
@@ -673,9 +678,13 @@ qlcnic_get_pauseparam(struct net_device *netdev, · 4 unmodified lines
673678 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
674679 return;
675680 /* get flow control settings */
676− val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port));
681+ val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
682+ if (err == -EIO)
683+ return;
677684 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val);
678− val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL);
685+ val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
686+ if (err == -EIO)
687+ return;
679688 switch (port) {
680689 case 0:
681690 pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val));
@@ -695,7 +704,9 @@ qlcnic_get_pauseparam(struct net_device *netdev, · 13 unmodified lines
695704 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
696705 return;
697706 pause->rx_pause = 1;
698− val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL);
707+ val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
708+ if (err == -EIO)
709+ return;
699710 if (port == 0)
700711 pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val));
701712 else
@@ -712,6 +723,7 @@ qlcnic_set_pauseparam(struct net_device *netdev, · 10 unmodified lines
712723 {
713724 struct qlcnic_adapter *adapter = netdev_priv(netdev);
714725 int port = adapter->ahw->physical_port;
726+ int err = 0;
715727 __u32 val;
716728
717729 if (qlcnic_83xx_check(adapter))
@@ -722,7 +734,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, · 4 unmodified lines
722734 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
723735 return -EIO;
724736 /* set flow control */
725− val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port));
737+ val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
738+ if (err == -EIO)
739+ return err;
726740
727741 if (pause->rx_pause)
728742 qlcnic_gb_rx_flowctl(val);
@@ -733,7 +747,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, · 4 unmodified lines
733747 val);
734748 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val);
735749 /* set autoneg */
736− val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL);
750+ val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
751+ if (err == -EIO)
752+ return err;
737753 switch (port) {
738754 case 0:
739755 if (pause->tx_pause)
@@ -769,7 +785,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, · 29 unmodified lines
769785 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
770786 return -EIO;
771787
772− val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL);
788+ val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
789+ if (err == -EIO)
790+ return err;
773791 if (port == 0) {
774792 if (pause->tx_pause)
775793 qlcnic_xg_unset_xg0_mask(val);
@@ -793,11 +811,14 @@ static int qlcnic_reg_test(struct net_device *dev) · 17 unmodified lines
793811 {
794812 struct qlcnic_adapter *adapter = netdev_priv(dev);
795813 u32 data_read;
814+ int err = 0;
796815
797816 if (qlcnic_83xx_check(adapter))
798817 return qlcnic_83xx_reg_test(adapter);
799818
800− data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0));
819+ data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err);
820+ if (err == -EIO)
821+ return err;
801822 if ((data_read & 0xffff) != adapter->pdev->vendor)
802823 return 1;
803824
@@ -1269,17 +1290,20 @@ qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) · 465 unmodified lines
12691290 {
12701291 struct qlcnic_adapter *adapter = netdev_priv(dev);
12711292 u32 wol_cfg;
1293+ int err = 0;
12721294
12731295 if (qlcnic_83xx_check(adapter))
12741296 return;
12751297 wol->supported = 0;
12761298 wol->wolopts = 0;
12771299
1278− wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
1300+ wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1301+ if (err == -EIO)
1302+ return;
12791303 if (wol_cfg & (1UL << adapter->portnum))
12801304 wol->supported |= WAKE_MAGIC;
12811305
1282− wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
1306+ wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
12831307 if (wol_cfg & (1UL << adapter->portnum))
12841308 wol->wolopts |= WAKE_MAGIC;
12851309 }
@@ -1289,17 +1313,22 @@ qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) · 3 unmodified lines
12891313 {
12901314 struct qlcnic_adapter *adapter = netdev_priv(dev);
12911315 u32 wol_cfg;
1316+ int err = 0;
12921317
12931318 if (qlcnic_83xx_check(adapter))
12941319 return -EOPNOTSUPP;
12951320 if (wol->wolopts & ~WAKE_MAGIC)
12961321 return -EINVAL;
12971322
1298− wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
1323+ wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1324+ if (err == -EIO)
1325+ return err;
12991326 if (!(wol_cfg & (1 << adapter->portnum)))
13001327 return -EOPNOTSUPP;
13011328
1302− wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
1329+ wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1330+ if (err == -EIO)
1331+ return err;
13031332 if (wol->wolopts & WAKE_MAGIC)
13041333 wol_cfg |= 1UL << adapter->portnum;
13051334 else
drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c+27−13
@@ -317,16 +317,20 @@ static void qlcnic_write_window_reg(u32 addr, void __iomem *bar0, u32 data) · 316 unmodified lines
317317 int
318318 qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
319319 {
320− int done = 0, timeout = 0;
320+ int timeout = 0;
321+ int err = 0;
322+ u32 done = 0;
321323
322324 while (!done) {
323− done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)));
325+ done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)),
326+ &err);
324327 if (done == 1)
325328 break;
326329 if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) {
327330 dev_err(&adapter->pdev->dev,
328331 "Failed to acquire sem=%d lock; holdby=%d\n",
329− sem, id_reg ? QLCRD32(adapter, id_reg) : -1);
332+ sem,
333+ id_reg ? QLCRD32(adapter, id_reg, &err) : -1);
330334 return -EIO;
331335 }
332336 msleep(1);
@@ -341,19 +345,22 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) · 8 unmodified lines
341345 void
342346 qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem)
343347 {
344− QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)));
348+ int err = 0;
349+
350+ QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)), &err);
345351 }
346352
347353 int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr)
348354 {
355+ int err = 0;
349356 u32 data;
350357
351358 if (qlcnic_82xx_check(adapter))
352359 qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data);
353360 else {
354− data = qlcnic_83xx_rd_reg_indirect(adapter, addr);
355− if (data == -EIO)
356− return -EIO;
361+ data = QLCRD32(adapter, addr, &err);
362+ if (err == -EIO)
363+ return err;
357364 }
358365 return data;
359366 }
@@ -1159,7 +1166,8 @@ int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *adapter, ulong off, · 799 unmodified lines
11591166 return -EIO;
11601167 }
11611168
1162−int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off)
1169+int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off,
1170+ int *err)
11631171 {
11641172 unsigned long flags;
11651173 int rv;
@@ -1415,7 +1423,7 @@ int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *adapter, u64 off, u64 *data) · 249 unmodified lines
14151423
14161424 int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
14171425 {
1418− int offset, board_type, magic;
1426+ int offset, board_type, magic, err = 0;
14191427 struct pci_dev *pdev = adapter->pdev;
14201428
14211429 offset = QLCNIC_FW_MAGIC_OFFSET;
@@ -1435,7 +1443,9 @@ int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) · 13 unmodified lines
14351443 adapter->ahw->board_type = board_type;
14361444
14371445 if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) {
1438− u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I);
1446+ u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I, &err);
1447+ if (err == -EIO)
1448+ return err;
14391449 if ((gpio & 0x8000) == 0)
14401450 board_type = QLCNIC_BRDTYPE_P3P_10G_TP;
14411451 }
@@ -1475,10 +1485,13 @@ int · 33 unmodified lines
14751485 qlcnic_wol_supported(struct qlcnic_adapter *adapter)
14761486 {
14771487 u32 wol_cfg;
1488+ int err = 0;
14781489
1479− wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
1490+ wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
14801491 if (wol_cfg & (1UL << adapter->portnum)) {
1481− wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
1492+ wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1493+ if (err == -EIO)
1494+ return err;
14821495 if (wol_cfg & (1 << adapter->portnum))
14831496 return 1;
14841497 }
@@ -1539,6 +1552,7 @@ void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter) · 54 unmodified lines
15391552 void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
15401553 loff_t offset, size_t size)
15411554 {
1555+ int err = 0;
15421556 u32 data;
15431557 u64 qmdata;
15441558
@@ -1546,7 +1560,7 @@ void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, · 1 unmodified line
15461560 qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata);
15471561 memcpy(buf, &qmdata, size);
15481562 } else {
1549− data = QLCRD32(adapter, offset);
1563+ data = QLCRD32(adapter, offset, &err);
15501564 memcpy(buf, &data, size);
15511565 }
15521566 }
drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h+1−1
@@ -154,7 +154,7 @@ struct qlcnic_hardware_context; · 153 unmodified lines
154154 struct qlcnic_adapter;
155155
156156 int qlcnic_82xx_start_firmware(struct qlcnic_adapter *);
157−int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong);
157+int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong, int *);
158158 int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32);
159159 int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int);
160160 int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c+17−8
@@ -286,10 +286,11 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter) · 285 unmodified lines
286286 {
287287 long timeout = 0;
288288 long done = 0;
289+ int err = 0;
289290
290291 cond_resched();
291292 while (done == 0) {
292− done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS);
293+ done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS, &err);
293294 done &= 2;
294295 if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) {
295296 dev_err(&adapter->pdev->dev,
@@ -304,6 +305,8 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter) · 8 unmodified lines
304305 static int do_rom_fast_read(struct qlcnic_adapter *adapter,
305306 u32 addr, u32 *valp)
306307 {
308+ int err = 0;
309+
307310 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr);
308311 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
309312 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3);
@@ -317,7 +320,9 @@ static int do_rom_fast_read(struct qlcnic_adapter *adapter, · 7 unmodified lines
317320 udelay(10);
318321 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
319322
320− *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA);
323+ *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA, &err);
324+ if (err == -EIO)
325+ return err;
321326 return 0;
322327 }
323328
@@ -369,11 +374,11 @@ int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp) · 45 unmodified lines
369374
370375 int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
371376 {
372− int addr, val;
377+ int addr, err = 0;
373378 int i, n, init_delay;
374379 struct crb_addr_pair *buf;
375380 unsigned offset;
376− u32 off;
381+ u32 off, val;
377382 struct pci_dev *pdev = adapter->pdev;
378383
379384 QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0);
@@ -402,7 +407,9 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) · 22 unmodified lines
402407 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00);
403408
404409 /* halt sre */
405− val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000);
410+ val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000, &err);
411+ if (err == -EIO)
412+ return err;
406413 QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1)));
407414
408415 /* halt epg */
@@ -719,10 +726,12 @@ qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter) · 310 unmodified lines
719726 static int
720727 qlcnic_has_mn(struct qlcnic_adapter *adapter)
721728 {
722− u32 capability;
723− capability = 0;
729+ u32 capability = 0;
730+ int err = 0;
724731
725− capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY);
732+ capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY, &err);
733+ if (err == -EIO)
734+ return err;
726735 if (capability & QLCNIC_PEG_TUNE_MN_PRESENT)
727736 return 1;
728737
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c+10−7
@@ -977,8 +977,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) · 976 unmodified lines
977977 static int
978978 qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
979979 {
980− int err;
981980 struct qlcnic_info nic_info;
981+ int err = 0;
982982
983983 memset(&nic_info, 0, sizeof(struct qlcnic_info));
984984 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func);
@@ -993,7 +993,9 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter) · 8 unmodified lines
993993
994994 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
995995 u32 temp;
996− temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
996+ temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err);
997+ if (err == -EIO)
998+ return err;
997999 adapter->ahw->extra_capability[0] = temp;
9981000 }
9991001 adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
@@ -3095,6 +3097,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) · 2095 unmodified lines
30953097 {
30963098 u32 state = 0, heartbeat;
30973099 u32 peg_status;
3100+ int err = 0;
30983101
30993102 if (qlcnic_check_temp(adapter))
31003103 goto detach;
@@ -3141,11 +3144,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) · 40 unmodified lines
31413144 "PEG_NET_4_PC: 0x%x\n",
31423145 peg_status,
31433146 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2),
3144− QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c),
3145− QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c),
3146− QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c),
3147− QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c),
3148− QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c));
3147+ QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err),
3148+ QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err),
3149+ QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err),
3150+ QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err),
3151+ QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err));
31493152 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
31503153 dev_err(&adapter->pdev->dev,
31513154 "Firmware aborted with error code 0x00006700. "