gianfar: Fix stashing support
authorAndy Fleming <afleming@freescale.com>
Thu, 5 Feb 2009 00:43:44 +0000 (16:43 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Feb 2009 00:43:44 +0000 (16:43 -0800)
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>
Documentation/powerpc/dts-bindings/fsl/tsec.txt
drivers/net/gianfar.c
drivers/net/gianfar_sysfs.c

index 7fa4b27574b5f54aabb1c9839e61fcf9f053c0ad..edb7ae19e868a2166c8c93e977a0d4064e95dfc2 100644 (file)
@@ -56,6 +56,12 @@ Properties:
     hardware.
   - fsl,magic-packet : If present, indicates that the hardware supports
     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:
        ethernet@24000 {
index 33de25602b32e285cd53655a6328f2a8ad52c457..dadd08cd801b5fdebe4d39be9ef12c0bcac27d58 100644 (file)
@@ -164,6 +164,9 @@ static int gfar_of_init(struct net_device *dev)
        struct gfar_private *priv = netdev_priv(dev);
        struct device_node *np = priv->node;
        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))
                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);
        if (mac_addr)
                memcpy(dev->dev_addr, mac_addr, MAC_ADDR_LEN);
index 74e0b4d42587ae5dd112cb47124d0789e45c63ae..dd26da74f27a0e0ba808bdbb5c42c89dec3cbf65 100644 (file)
@@ -53,6 +53,9 @@ static ssize_t gfar_set_bd_stash(struct device *dev,
        u32 temp;
        unsigned long flags;
 
+       if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BD_STASHING))
+               return count;
+
        /* Find out the new setting */
        if (!strncmp("on", buf, count - 1) || !strncmp("1", buf, count - 1))
                new_setting = 1;
@@ -100,6 +103,9 @@ static ssize_t gfar_set_rx_stash_size(struct device *dev,
        u32 temp;
        unsigned long flags;
 
+       if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING))
+               return count;
+
        spin_lock_irqsave(&priv->rxlock, flags);
        if (length > priv->rx_buffer_size)
                goto out;
@@ -152,6 +158,9 @@ static ssize_t gfar_set_rx_stash_index(struct device *dev,
        u32 temp;
        unsigned long flags;
 
+       if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING))
+               return count;
+
        spin_lock_irqsave(&priv->rxlock, flags);
        if (index > priv->rx_stash_size)
                goto out;
@@ -294,12 +303,9 @@ void gfar_init_sysfs(struct net_device *dev)
        int rc;
 
        /* 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_starve = DEFAULT_FIFO_TX_STARVE;
        priv->fifo_starve_off = DEFAULT_FIFO_TX_STARVE_OFF;
-       priv->bd_stash_en = DEFAULT_BD_STASH;
 
        /* Create our sysfs files */
        rc = device_create_file(&dev->dev, &dev_attr_bd_stash);