Message ID | 4A7A0BAA.7020104@ring3k.org |
---|---|
State | Rejected, archived |
Delegated to: | David Miller |
Headers | show |
On Thu, 06 Aug 2009 07:46:02 +0900 Mike McCormack <mikem@ring3k.org> wrote: > As multiple sky2 devices share some of the same hardware, and ethtool > operations are per device, access to transmit timers, eeprom access, > coalesce, etc. should be serialized. > > Only tested on a single port card, as my sky2 doesn't have dual ports. > > Signed-off-by: Mike McCormack <mikem@ring3k.org> NAK. The ethtool operations are already serialized by rtnl mutex at higher level. See net/core/dev.c -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 06 Aug 2009 07:46:02 +0900 Mike McCormack <mikem@ring3k.org> wrote: > As multiple sky2 devices share some of the same hardware, and ethtool > operations are per device, access to transmit timers, eeprom access, > coalesce, etc. should be serialized. > > Only tested on a single port card, as my sky2 doesn't have dual ports. > > Signed-off-by: Mike McCormack <mikem@ring3k.org> NAK. The ethtool operations are already serialized by rtnl mutex at higher level. See net/core/dev.c
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 1415a83..96aad19 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -3923,6 +3923,18 @@ static int sky2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom return sky2_vpd_write(sky2->hw, cap, data, eeprom->offset, eeprom->len); } +static int sky2_ethtool_begin(struct net_device *dev) +{ + struct sky2_port *sky2 = netdev_priv(dev); + mutex_lock(&sky2->hw->ethtool_mutex); + return 0; +} + +static void sky2_ethtool_complete(struct net_device *dev) +{ + struct sky2_port *sky2 = netdev_priv(dev); + mutex_unlock(&sky2->hw->ethtool_mutex); +} static const struct ethtool_ops sky2_ethtool_ops = { .get_settings = sky2_get_settings, @@ -3954,6 +3966,8 @@ static const struct ethtool_ops sky2_ethtool_ops = { .phys_id = sky2_phys_id, .get_sset_count = sky2_get_sset_count, .get_ethtool_stats = sky2_get_ethtool_stats, + .begin = sky2_ethtool_begin, + .complete = sky2_ethtool_complete, }; #ifdef CONFIG_SKY2_DEBUG @@ -4485,6 +4499,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, } hw->pdev = pdev; + mutex_init(&hw->ethtool_mutex); hw->regs = ioremap_nocache(pci_resource_start(pdev, 0), 0x4000); if (!hw->regs) { diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 4486b06..199fb4a 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -2087,6 +2087,7 @@ struct sky2_hw { struct timer_list watchdog_timer; struct work_struct restart_work; wait_queue_head_t msi_wait; + struct mutex ethtool_mutex; }; static inline int sky2_is_copper(const struct sky2_hw *hw)
As multiple sky2 devices share some of the same hardware, and ethtool operations are per device, access to transmit timers, eeprom access, coalesce, etc. should be serialized. Only tested on a single port card, as my sky2 doesn't have dual ports. Signed-off-by: Mike McCormack <mikem@ring3k.org> --- drivers/net/sky2.c | 15 +++++++++++++++ drivers/net/sky2.h | 1 + 2 files changed, 16 insertions(+), 0 deletions(-)