Loading drivers/net/cxgb3/cxgb3_main.c +57 −12 Original line number Diff line number Diff line Loading @@ -493,6 +493,36 @@ static void enable_all_napi(struct adapter *adap) napi_enable(&adap->sge.qs[i].napi); } /** * set_qset_lro - Turn a queue set's LRO capability on and off * @dev: the device the qset is attached to * @qset_idx: the queue set index * @val: the LRO switch * * Sets LRO on or off for a particular queue set. * the device's features flag is updated to reflect the LRO * capability when all queues belonging to the device are * in the same state. */ static void set_qset_lro(struct net_device *dev, int qset_idx, int val) { struct port_info *pi = netdev_priv(dev); struct adapter *adapter = pi->adapter; int i, lro_on = 1; adapter->params.sge.qset[qset_idx].lro = !!val; adapter->sge.qs[qset_idx].lro_enabled = !!val; /* let ethtool report LRO on only if all queues are LRO enabled */ for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; ++i) lro_on &= adapter->params.sge.qset[i].lro; if (lro_on) dev->features |= NETIF_F_LRO; else dev->features &= ~NETIF_F_LRO; } /** * setup_sge_qsets - configure SGE Tx/Rx/response queues * @adap: the adapter Loading @@ -516,8 +546,7 @@ static int setup_sge_qsets(struct adapter *adap) pi->qs = &adap->sge.qs[pi->first_qset]; for (j = pi->first_qset; j < pi->first_qset + pi->nqsets; ++j, ++qset_idx) { if (!pi->rx_csum_offload) adap->params.sge.qset[qset_idx].lro = 0; set_qset_lro(dev, qset_idx, pi->rx_csum_offload); err = t3_sge_alloc_qset(adap, qset_idx, 1, (adap->flags & USING_MSIX) ? qset_idx + 1 : irq_idx, Loading Loading @@ -1632,13 +1661,10 @@ static int set_rx_csum(struct net_device *dev, u32 data) p->rx_csum_offload = data; if (!data) { struct adapter *adap = p->adapter; int i; for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) { adap->params.sge.qset[i].lro = 0; adap->sge.qs[i].lro_enabled = 0; } for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) set_qset_lro(dev, i, 0); } return 0; } Loading Loading @@ -1793,6 +1819,25 @@ static void get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) memset(&wol->sopass, 0, sizeof(wol->sopass)); } static int cxgb3_set_flags(struct net_device *dev, u32 data) { struct port_info *pi = netdev_priv(dev); int i; if (data & ETH_FLAG_LRO) { if (!pi->rx_csum_offload) return -EINVAL; for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++) set_qset_lro(dev, i, 1); } else for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++) set_qset_lro(dev, i, 0); return 0; } static const struct ethtool_ops cxgb_ethtool_ops = { .get_settings = get_settings, .set_settings = set_settings, Loading Loading @@ -1822,6 +1867,8 @@ static const struct ethtool_ops cxgb_ethtool_ops = { .get_regs = get_regs, .get_wol = get_wol, .set_tso = ethtool_op_set_tso, .get_flags = ethtool_op_get_flags, .set_flags = cxgb3_set_flags, }; static int in_range(int val, int lo, int hi) Loading Loading @@ -1938,11 +1985,9 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) } } } if (t.lro >= 0) { struct sge_qset *qs = &adapter->sge.qs[t.qset_idx]; q->lro = t.lro; qs->lro_enabled = t.lro; } if (t.lro >= 0) set_qset_lro(dev, t.qset_idx, t.lro); break; } case CHELSIO_GET_QSET_PARAMS:{ Loading Loading
drivers/net/cxgb3/cxgb3_main.c +57 −12 Original line number Diff line number Diff line Loading @@ -493,6 +493,36 @@ static void enable_all_napi(struct adapter *adap) napi_enable(&adap->sge.qs[i].napi); } /** * set_qset_lro - Turn a queue set's LRO capability on and off * @dev: the device the qset is attached to * @qset_idx: the queue set index * @val: the LRO switch * * Sets LRO on or off for a particular queue set. * the device's features flag is updated to reflect the LRO * capability when all queues belonging to the device are * in the same state. */ static void set_qset_lro(struct net_device *dev, int qset_idx, int val) { struct port_info *pi = netdev_priv(dev); struct adapter *adapter = pi->adapter; int i, lro_on = 1; adapter->params.sge.qset[qset_idx].lro = !!val; adapter->sge.qs[qset_idx].lro_enabled = !!val; /* let ethtool report LRO on only if all queues are LRO enabled */ for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; ++i) lro_on &= adapter->params.sge.qset[i].lro; if (lro_on) dev->features |= NETIF_F_LRO; else dev->features &= ~NETIF_F_LRO; } /** * setup_sge_qsets - configure SGE Tx/Rx/response queues * @adap: the adapter Loading @@ -516,8 +546,7 @@ static int setup_sge_qsets(struct adapter *adap) pi->qs = &adap->sge.qs[pi->first_qset]; for (j = pi->first_qset; j < pi->first_qset + pi->nqsets; ++j, ++qset_idx) { if (!pi->rx_csum_offload) adap->params.sge.qset[qset_idx].lro = 0; set_qset_lro(dev, qset_idx, pi->rx_csum_offload); err = t3_sge_alloc_qset(adap, qset_idx, 1, (adap->flags & USING_MSIX) ? qset_idx + 1 : irq_idx, Loading Loading @@ -1632,13 +1661,10 @@ static int set_rx_csum(struct net_device *dev, u32 data) p->rx_csum_offload = data; if (!data) { struct adapter *adap = p->adapter; int i; for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) { adap->params.sge.qset[i].lro = 0; adap->sge.qs[i].lro_enabled = 0; } for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) set_qset_lro(dev, i, 0); } return 0; } Loading Loading @@ -1793,6 +1819,25 @@ static void get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) memset(&wol->sopass, 0, sizeof(wol->sopass)); } static int cxgb3_set_flags(struct net_device *dev, u32 data) { struct port_info *pi = netdev_priv(dev); int i; if (data & ETH_FLAG_LRO) { if (!pi->rx_csum_offload) return -EINVAL; for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++) set_qset_lro(dev, i, 1); } else for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++) set_qset_lro(dev, i, 0); return 0; } static const struct ethtool_ops cxgb_ethtool_ops = { .get_settings = get_settings, .set_settings = set_settings, Loading Loading @@ -1822,6 +1867,8 @@ static const struct ethtool_ops cxgb_ethtool_ops = { .get_regs = get_regs, .get_wol = get_wol, .set_tso = ethtool_op_set_tso, .get_flags = ethtool_op_get_flags, .set_flags = cxgb3_set_flags, }; static int in_range(int val, int lo, int hi) Loading Loading @@ -1938,11 +1985,9 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) } } } if (t.lro >= 0) { struct sge_qset *qs = &adapter->sge.qs[t.qset_idx]; q->lro = t.lro; qs->lro_enabled = t.lro; } if (t.lro >= 0) set_qset_lro(dev, t.qset_idx, t.lro); break; } case CHELSIO_GET_QSET_PARAMS:{ Loading