mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
gianfar: Fix stashing support
Stashing is only supported on the 85xx (e500-based) SoCs. The 83xx and 86xx chips don't have a proper cache for this. U-Boot has been updated to add stashing properties to the device tree nodes of gianfar devices on 85xx. So now we modify Linux to keep stashing off unless those properties are there. Signed-off-by: Andy Fleming <afleming@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0fd56bb5be
commit
4d7902f22b
@ -56,6 +56,12 @@ Properties:
|
|||||||
hardware.
|
hardware.
|
||||||
- fsl,magic-packet : If present, indicates that the hardware supports
|
- fsl,magic-packet : If present, indicates that the hardware supports
|
||||||
waking up via magic packet.
|
waking up via magic packet.
|
||||||
|
- bd-stash : If present, indicates that the hardware supports stashing
|
||||||
|
buffer descriptors in the L2.
|
||||||
|
- rx-stash-len : Denotes the number of bytes of a received buffer to stash
|
||||||
|
in the L2.
|
||||||
|
- rx-stash-idx : Denotes the index of the first byte from the received
|
||||||
|
buffer to stash in the L2.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
ethernet@24000 {
|
ethernet@24000 {
|
||||||
|
@ -164,6 +164,9 @@ static int gfar_of_init(struct net_device *dev)
|
|||||||
struct gfar_private *priv = netdev_priv(dev);
|
struct gfar_private *priv = netdev_priv(dev);
|
||||||
struct device_node *np = priv->node;
|
struct device_node *np = priv->node;
|
||||||
char bus_name[MII_BUS_ID_SIZE];
|
char bus_name[MII_BUS_ID_SIZE];
|
||||||
|
const u32 *stash;
|
||||||
|
const u32 *stash_len;
|
||||||
|
const u32 *stash_idx;
|
||||||
|
|
||||||
if (!np || !of_device_is_available(np))
|
if (!np || !of_device_is_available(np))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@ -193,6 +196,26 @@ static int gfar_of_init(struct net_device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stash = of_get_property(np, "bd-stash", NULL);
|
||||||
|
|
||||||
|
if(stash) {
|
||||||
|
priv->device_flags |= FSL_GIANFAR_DEV_HAS_BD_STASHING;
|
||||||
|
priv->bd_stash_en = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
stash_len = of_get_property(np, "rx-stash-len", NULL);
|
||||||
|
|
||||||
|
if (stash_len)
|
||||||
|
priv->rx_stash_size = *stash_len;
|
||||||
|
|
||||||
|
stash_idx = of_get_property(np, "rx-stash-idx", NULL);
|
||||||
|
|
||||||
|
if (stash_idx)
|
||||||
|
priv->rx_stash_index = *stash_idx;
|
||||||
|
|
||||||
|
if (stash_len || stash_idx)
|
||||||
|
priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;
|
||||||
|
|
||||||
mac_addr = of_get_mac_address(np);
|
mac_addr = of_get_mac_address(np);
|
||||||
if (mac_addr)
|
if (mac_addr)
|
||||||
memcpy(dev->dev_addr, mac_addr, MAC_ADDR_LEN);
|
memcpy(dev->dev_addr, mac_addr, MAC_ADDR_LEN);
|
||||||
|
@ -53,6 +53,9 @@ static ssize_t gfar_set_bd_stash(struct device *dev,
|
|||||||
u32 temp;
|
u32 temp;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BD_STASHING))
|
||||||
|
return count;
|
||||||
|
|
||||||
/* Find out the new setting */
|
/* Find out the new setting */
|
||||||
if (!strncmp("on", buf, count - 1) || !strncmp("1", buf, count - 1))
|
if (!strncmp("on", buf, count - 1) || !strncmp("1", buf, count - 1))
|
||||||
new_setting = 1;
|
new_setting = 1;
|
||||||
@ -100,6 +103,9 @@ static ssize_t gfar_set_rx_stash_size(struct device *dev,
|
|||||||
u32 temp;
|
u32 temp;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING))
|
||||||
|
return count;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->rxlock, flags);
|
spin_lock_irqsave(&priv->rxlock, flags);
|
||||||
if (length > priv->rx_buffer_size)
|
if (length > priv->rx_buffer_size)
|
||||||
goto out;
|
goto out;
|
||||||
@ -152,6 +158,9 @@ static ssize_t gfar_set_rx_stash_index(struct device *dev,
|
|||||||
u32 temp;
|
u32 temp;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING))
|
||||||
|
return count;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->rxlock, flags);
|
spin_lock_irqsave(&priv->rxlock, flags);
|
||||||
if (index > priv->rx_stash_size)
|
if (index > priv->rx_stash_size)
|
||||||
goto out;
|
goto out;
|
||||||
@ -294,12 +303,9 @@ void gfar_init_sysfs(struct net_device *dev)
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Initialize the default values */
|
/* Initialize the default values */
|
||||||
priv->rx_stash_size = DEFAULT_STASH_LENGTH;
|
|
||||||
priv->rx_stash_index = DEFAULT_STASH_INDEX;
|
|
||||||
priv->fifo_threshold = DEFAULT_FIFO_TX_THR;
|
priv->fifo_threshold = DEFAULT_FIFO_TX_THR;
|
||||||
priv->fifo_starve = DEFAULT_FIFO_TX_STARVE;
|
priv->fifo_starve = DEFAULT_FIFO_TX_STARVE;
|
||||||
priv->fifo_starve_off = DEFAULT_FIFO_TX_STARVE_OFF;
|
priv->fifo_starve_off = DEFAULT_FIFO_TX_STARVE_OFF;
|
||||||
priv->bd_stash_en = DEFAULT_BD_STASH;
|
|
||||||
|
|
||||||
/* Create our sysfs files */
|
/* Create our sysfs files */
|
||||||
rc = device_create_file(&dev->dev, &dev_attr_bd_stash);
|
rc = device_create_file(&dev->dev, &dev_attr_bd_stash);
|
||||||
|
Loading…
Reference in New Issue
Block a user