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