|
@@ -1495,9 +1495,7 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev,
|
|
|
struct ethtool_coalesce *ethcoal)
|
|
|
{
|
|
|
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
|
|
- struct qlcnic_nic_intr_coalesce *coal;
|
|
|
- u32 rx_coalesce_usecs, rx_max_frames;
|
|
|
- u32 tx_coalesce_usecs, tx_max_frames;
|
|
|
+ int err;
|
|
|
|
|
|
if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
|
|
|
return -EINVAL;
|
|
@@ -1507,82 +1505,31 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev,
|
|
|
* unsupported parameters are set.
|
|
|
*/
|
|
|
if (ethcoal->rx_coalesce_usecs > 0xffff ||
|
|
|
- ethcoal->rx_max_coalesced_frames > 0xffff ||
|
|
|
- ethcoal->tx_coalesce_usecs > 0xffff ||
|
|
|
- ethcoal->tx_max_coalesced_frames > 0xffff ||
|
|
|
- ethcoal->rx_coalesce_usecs_irq ||
|
|
|
- ethcoal->rx_max_coalesced_frames_irq ||
|
|
|
- ethcoal->tx_coalesce_usecs_irq ||
|
|
|
- ethcoal->tx_max_coalesced_frames_irq ||
|
|
|
- ethcoal->stats_block_coalesce_usecs ||
|
|
|
- ethcoal->use_adaptive_rx_coalesce ||
|
|
|
- ethcoal->use_adaptive_tx_coalesce ||
|
|
|
- ethcoal->pkt_rate_low ||
|
|
|
- ethcoal->rx_coalesce_usecs_low ||
|
|
|
- ethcoal->rx_max_coalesced_frames_low ||
|
|
|
- ethcoal->tx_coalesce_usecs_low ||
|
|
|
- ethcoal->tx_max_coalesced_frames_low ||
|
|
|
- ethcoal->pkt_rate_high ||
|
|
|
- ethcoal->rx_coalesce_usecs_high ||
|
|
|
- ethcoal->rx_max_coalesced_frames_high ||
|
|
|
- ethcoal->tx_coalesce_usecs_high ||
|
|
|
- ethcoal->tx_max_coalesced_frames_high)
|
|
|
+ ethcoal->rx_max_coalesced_frames > 0xffff ||
|
|
|
+ ethcoal->tx_coalesce_usecs > 0xffff ||
|
|
|
+ ethcoal->tx_max_coalesced_frames > 0xffff ||
|
|
|
+ ethcoal->rx_coalesce_usecs_irq ||
|
|
|
+ ethcoal->rx_max_coalesced_frames_irq ||
|
|
|
+ ethcoal->tx_coalesce_usecs_irq ||
|
|
|
+ ethcoal->tx_max_coalesced_frames_irq ||
|
|
|
+ ethcoal->stats_block_coalesce_usecs ||
|
|
|
+ ethcoal->use_adaptive_rx_coalesce ||
|
|
|
+ ethcoal->use_adaptive_tx_coalesce ||
|
|
|
+ ethcoal->pkt_rate_low ||
|
|
|
+ ethcoal->rx_coalesce_usecs_low ||
|
|
|
+ ethcoal->rx_max_coalesced_frames_low ||
|
|
|
+ ethcoal->tx_coalesce_usecs_low ||
|
|
|
+ ethcoal->tx_max_coalesced_frames_low ||
|
|
|
+ ethcoal->pkt_rate_high ||
|
|
|
+ ethcoal->rx_coalesce_usecs_high ||
|
|
|
+ ethcoal->rx_max_coalesced_frames_high ||
|
|
|
+ ethcoal->tx_coalesce_usecs_high ||
|
|
|
+ ethcoal->tx_max_coalesced_frames_high)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- coal = &adapter->ahw->coal;
|
|
|
+ err = qlcnic_config_intr_coalesce(adapter, ethcoal);
|
|
|
|
|
|
- if (qlcnic_83xx_check(adapter)) {
|
|
|
- if (!ethcoal->tx_coalesce_usecs ||
|
|
|
- !ethcoal->tx_max_coalesced_frames ||
|
|
|
- !ethcoal->rx_coalesce_usecs ||
|
|
|
- !ethcoal->rx_max_coalesced_frames) {
|
|
|
- coal->flag = QLCNIC_INTR_DEFAULT;
|
|
|
- coal->type = QLCNIC_INTR_COAL_TYPE_RX;
|
|
|
- coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
|
|
|
- coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
|
|
|
- coal->tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
|
|
|
- coal->tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
|
|
|
- } else {
|
|
|
- tx_coalesce_usecs = ethcoal->tx_coalesce_usecs;
|
|
|
- tx_max_frames = ethcoal->tx_max_coalesced_frames;
|
|
|
- rx_coalesce_usecs = ethcoal->rx_coalesce_usecs;
|
|
|
- rx_max_frames = ethcoal->rx_max_coalesced_frames;
|
|
|
- coal->flag = 0;
|
|
|
-
|
|
|
- if ((coal->rx_time_us == rx_coalesce_usecs) &&
|
|
|
- (coal->rx_packets == rx_max_frames)) {
|
|
|
- coal->type = QLCNIC_INTR_COAL_TYPE_TX;
|
|
|
- coal->tx_time_us = tx_coalesce_usecs;
|
|
|
- coal->tx_packets = tx_max_frames;
|
|
|
- } else if ((coal->tx_time_us == tx_coalesce_usecs) &&
|
|
|
- (coal->tx_packets == tx_max_frames)) {
|
|
|
- coal->type = QLCNIC_INTR_COAL_TYPE_RX;
|
|
|
- coal->rx_time_us = rx_coalesce_usecs;
|
|
|
- coal->rx_packets = rx_max_frames;
|
|
|
- } else {
|
|
|
- coal->type = QLCNIC_INTR_COAL_TYPE_RX;
|
|
|
- coal->rx_time_us = rx_coalesce_usecs;
|
|
|
- coal->rx_packets = rx_max_frames;
|
|
|
- coal->tx_time_us = tx_coalesce_usecs;
|
|
|
- coal->tx_packets = tx_max_frames;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (!ethcoal->rx_coalesce_usecs ||
|
|
|
- !ethcoal->rx_max_coalesced_frames) {
|
|
|
- coal->flag = QLCNIC_INTR_DEFAULT;
|
|
|
- coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
|
|
|
- coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
|
|
|
- } else {
|
|
|
- coal->flag = 0;
|
|
|
- coal->rx_time_us = ethcoal->rx_coalesce_usecs;
|
|
|
- coal->rx_packets = ethcoal->rx_max_coalesced_frames;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- qlcnic_config_intr_coalesce(adapter);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int qlcnic_get_intr_coalesce(struct net_device *netdev,
|