Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

be2net: fix to avoid sending get_stats request if one is already being processed.

GET_STATS request uses the same memory region as the response.
If a new request for get stats is fired before the response for
the previous get_stats request is received, the response will
corrupt the new request, causing the f/w to misbehave.

Signed-off-by: Somnath K <somnathk@serverengines.com>
Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ajit Khaparde and committed by
David S. Miller
0fc48c37 48e9989e

+5 -1
+1
drivers/net/benet/be.h
··· 289 289 u32 rx_fc; /* Rx flow control */ 290 290 u32 tx_fc; /* Tx flow control */ 291 291 bool ue_detected; 292 + bool stats_ioctl_sent; 292 293 int link_speed; 293 294 u8 port_type; 294 295 u8 transceiver;
+2
drivers/net/benet/be_cmds.c
··· 75 75 be_dws_le_to_cpu(&resp->hw_stats, 76 76 sizeof(resp->hw_stats)); 77 77 netdev_stats_update(adapter); 78 + adapter->stats_ioctl_sent = false; 78 79 } 79 80 } else if ((compl_status != MCC_STATUS_NOT_SUPPORTED) && 80 81 (compl->tag0 != OPCODE_COMMON_NTWK_MAC_QUERY)) { ··· 952 951 sge->len = cpu_to_le32(nonemb_cmd->size); 953 952 954 953 be_mcc_notify(adapter); 954 + adapter->stats_ioctl_sent = true; 955 955 956 956 err: 957 957 spin_unlock_bh(&adapter->mcc_lock);
+2 -1
drivers/net/benet/be_main.c
··· 1801 1801 struct be_adapter *adapter = 1802 1802 container_of(work, struct be_adapter, work.work); 1803 1803 1804 - be_cmd_get_stats(adapter, &adapter->stats.cmd); 1804 + if (!adapter->stats_ioctl_sent) 1805 + be_cmd_get_stats(adapter, &adapter->stats.cmd); 1805 1806 1806 1807 /* Set EQ delay */ 1807 1808 be_rx_eqd_update(adapter);