mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
8b902aea40
commit
b58ecad8d6
|
@ -232,6 +232,7 @@ enum {
|
|||
#define MPORT_SINGLE_FUNCTION_MODE 0x1111
|
||||
|
||||
extern unsigned long long netxen_dma_mask;
|
||||
extern unsigned long last_schedule_time;
|
||||
|
||||
/*
|
||||
* NetXen host-peg signal message structure
|
||||
|
|
|
@ -462,6 +462,7 @@ netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
|
|||
}
|
||||
printk(KERN_INFO "%s: flash unlocked. \n",
|
||||
netxen_nic_driver_name);
|
||||
last_schedule_time = jiffies;
|
||||
ret = netxen_flash_erase_secondary(adapter);
|
||||
if (ret != FLASH_SUCCESS) {
|
||||
printk(KERN_ERR "%s: Flash erase failed.\n",
|
||||
|
|
|
@ -42,6 +42,8 @@ struct crb_addr_pair {
|
|||
u32 data;
|
||||
};
|
||||
|
||||
unsigned long last_schedule_time;
|
||||
|
||||
#define NETXEN_MAX_CRB_XFORM 60
|
||||
static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM];
|
||||
#define NETXEN_ADDR_ERROR (0xffffffff)
|
||||
|
@ -404,9 +406,14 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
|
|||
static inline int
|
||||
do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
|
||||
{
|
||||
if (jiffies > (last_schedule_time + (8 * HZ))) {
|
||||
last_schedule_time = jiffies;
|
||||
schedule();
|
||||
}
|
||||
|
||||
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
|
||||
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
|
||||
udelay(70); /* prevent bursting on CRB */
|
||||
udelay(100); /* prevent bursting on CRB */
|
||||
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
|
||||
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb);
|
||||
if (netxen_wait_rom_done(adapter)) {
|
||||
|
@ -415,7 +422,7 @@ do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
|
|||
}
|
||||
/* reset abyte_cnt and dummy_byte_cnt */
|
||||
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0);
|
||||
udelay(70); /* prevent bursting on CRB */
|
||||
udelay(100); /* prevent bursting on CRB */
|
||||
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
|
||||
|
||||
*valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
|
||||
|
|
Loading…
Reference in New Issue