static ssize_t gfar_set_rx_stash_index(struct class_device *cdev, const char *buf, size_t count) { struct net_device *dev = to_net_dev(cdev); struct gfar_private *priv = netdev_priv(dev); unsigned short index = simple_strtoul(buf, NULL, 0); u32 temp; unsigned long flags; spin_lock_irqsave(&priv->rxlock, flags); if (index > priv->rx_stash_size) return count; if (index == priv->rx_stash_index) return count; priv->rx_stash_index = index; temp = gfar_read(&priv->regs->attreli); temp &= ~ATTRELI_EI_MASK; temp |= ATTRELI_EI(index); gfar_write(&priv->regs->attreli, flags); spin_unlock_irqrestore(&priv->rxlock, flags); return count; }
static ssize_t gfar_set_rx_stash_index(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct gfar_private *priv = netdev_priv(to_net_dev(dev)); struct gfar __iomem *regs = priv->gfargrp[0].regs; unsigned short index = simple_strtoul(buf, NULL, 0); u32 temp; unsigned long flags; if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING)) return count; local_irq_save(flags); lock_rx_qs(priv); if (index > priv->rx_stash_size) goto out; if (index == priv->rx_stash_index) goto out; priv->rx_stash_index = index; temp = gfar_read(®s->attreli); temp &= ~ATTRELI_EI_MASK; temp |= ATTRELI_EI(index); gfar_write(®s->attreli, temp); out: unlock_rx_qs(priv); local_irq_restore(flags); return count; }