NetXen: Fix softlockup seen during hardware access

NetXen: This will fix a softlock seen on some machines.
The reason was too much time was spent waiting for hardware access
to go through.

Signed-off by: Mithlesh Thukral <mithlesh@netxen.com>

Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Linsys Contractor Mithlesh Thukral and committed by Jeff Garzik b58ecad8 8b902aea

+11 -2
+1
drivers/net/netxen/netxen_nic.h
··· 232 232 #define MPORT_SINGLE_FUNCTION_MODE 0x1111 233 233 234 234 extern unsigned long long netxen_dma_mask; 235 + extern unsigned long last_schedule_time; 235 236 236 237 /* 237 238 * NetXen host-peg signal message structure
+1
drivers/net/netxen/netxen_nic_ethtool.c
··· 462 462 } 463 463 printk(KERN_INFO "%s: flash unlocked. \n", 464 464 netxen_nic_driver_name); 465 + last_schedule_time = jiffies; 465 466 ret = netxen_flash_erase_secondary(adapter); 466 467 if (ret != FLASH_SUCCESS) { 467 468 printk(KERN_ERR "%s: Flash erase failed.\n",
+9 -2
drivers/net/netxen/netxen_nic_init.c
··· 42 42 u32 data; 43 43 }; 44 44 45 + unsigned long last_schedule_time; 46 + 45 47 #define NETXEN_MAX_CRB_XFORM 60 46 48 static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; 47 49 #define NETXEN_ADDR_ERROR (0xffffffff) ··· 406 404 static inline int 407 405 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) 408 406 { 407 + if (jiffies > (last_schedule_time + (8 * HZ))) { 408 + last_schedule_time = jiffies; 409 + schedule(); 410 + } 411 + 409 412 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); 410 413 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); 411 - udelay(70); /* prevent bursting on CRB */ 414 + udelay(100); /* prevent bursting on CRB */ 412 415 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 413 416 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); 414 417 if (netxen_wait_rom_done(adapter)) { ··· 422 415 } 423 416 /* reset abyte_cnt and dummy_byte_cnt */ 424 417 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); 425 - udelay(70); /* prevent bursting on CRB */ 418 + udelay(100); /* prevent bursting on CRB */ 426 419 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 427 420 428 421 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);