static ssize_t mv_eth_3_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { const char *name = attr->attr.name; int err; unsigned int p, i, v; unsigned long flags; if (!capable(CAP_NET_ADMIN)) return -EPERM; err = p = i = v = 0; sscanf(buf, "%d %d %d", &p, &i, &v); local_irq_save(flags); if (!strcmp(name, "txp_rate")) { err = mvNetaTxpRateSet(p, i, v); } else if (!strcmp(name, "txp_burst")) { err = mvNetaTxpBurstSet(p, i, v); } else if (!strcmp(name, "ejp")) { err = mvNetaTxpEjpSet(p, i, v); } else if (!strcmp(name, "rxq_size")) { err = mv_eth_ctrl_rxq_size_set(p, i, v); } else if (!strcmp(name, "rxq_pkts_coal")) { err = mv_eth_rx_ptks_coal_set(p, i, v); } else if (!strcmp(name, "rxq_time_coal")) { err = mv_eth_rx_time_coal_set(p, i, v); } else if (!strcmp(name, "rxq")) { mvNetaRxqShow(p, i, v); } else if (!strcmp(name, "rxq_regs")) { mvNetaRxqRegs(p, i); } else if (!strcmp(name, "buf_num")) { err = mv_eth_ctrl_port_buf_num_set(p, i, v); } else if (!strcmp(name, "rx_reset")) { err = mv_eth_rx_reset(p); } else if (!strcmp(name, "txp_reset")) { err = mv_eth_txp_reset(p, i); } else if (!strcmp(name, "rx_weight")) { err = mv_eth_ctrl_set_poll_rx_weight(p, i); } else if (!strcmp(name, "tx_done")) { mv_eth_ctrl_txdone(p); } else if (!strcmp(name, "rxq_type")) { err = run_rxq_type(p, i, v); } else { err = 1; printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name); } local_irq_restore(flags); if (err) printk(KERN_ERR "%s: error %d\n", __func__, err); return err ? -EINVAL : len; }
/****************************************************************************** * mv_eth_tool_set_coalesce * Description: * ethtool set RX/TX coalesce parameters * INPUT: * netdev Network device structure pointer * cmd Coalesce parameters * OUTPUT * None * RETURN: * 0 on success * *******************************************************************************/ int mv_eth_tool_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *cmd) { struct eth_port *pp = MV_ETH_PRIV(netdev); int rxq, txp, txq; /* can't set rx coalesce with both 0 pkts and 0 usecs, tx coalesce supports only pkts */ if ((!cmd->rx_coalesce_usecs && !cmd->rx_max_coalesced_frames) || (!cmd->tx_max_coalesced_frames)) return -EPERM; for (rxq = 0; rxq < CONFIG_MV_ETH_RXQ; rxq++) { mv_eth_rx_ptks_coal_set(pp->port, rxq, cmd->rx_max_coalesced_frames); mv_eth_rx_time_coal_set(pp->port, rxq, cmd->rx_coalesce_usecs); } for (txp = 0; txp < pp->txp_num; txp++) for (txq = 0; txq < CONFIG_MV_ETH_TXQ; txq++) mv_eth_tx_done_ptks_coal_set(pp->port, txp, txq, cmd->tx_max_coalesced_frames); return 0; }