mirror of https://gitee.com/openkylin/linux.git
gianfar: Remove sysfs stubs for FIFOCFG and stashing
Removing the sysfs stubs for the Tx FIFOCFG and ATTRELI (stashing) config registers, as these registers may only be configured after a MAC reset, with the controller stopped (i.e. during hw init, at probe() time). The current sysfs stubs allow on-the-fly updates of these registers (the locking measures are useless and only add unecessary code). Changing these registers is discouraged. Only the default values will be used instead. Moreover, the stashing (ATTRELI) configuration options were effectively disabled (didn't get to the hw anyway if changed) because the stashing device_flags (HAS_BD_STASHING|HAS_BUF_STASHING) were "accidentally" cleared during probe(). Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
208627883e
commit
34018fd419
|
@ -1,38 +1,8 @@
|
|||
The Gianfar Ethernet Driver
|
||||
Sysfs File description
|
||||
|
||||
Author: Andy Fleming <afleming@freescale.com>
|
||||
Updated: 2005-07-28
|
||||
|
||||
SYSFS
|
||||
|
||||
Several of the features of the gianfar driver are controlled
|
||||
through sysfs files. These are:
|
||||
|
||||
bd_stash:
|
||||
To stash RX Buffer Descriptors in the L2, echo 'on' or '1' to
|
||||
bd_stash, echo 'off' or '0' to disable
|
||||
|
||||
rx_stash_len:
|
||||
To stash the first n bytes of the packet in L2, echo the number
|
||||
of bytes to buf_stash_len. echo 0 to disable.
|
||||
|
||||
WARNING: You could really screw these up if you set them too low or high!
|
||||
fifo_threshold:
|
||||
To change the number of bytes the controller needs in the
|
||||
fifo before it starts transmission, echo the number of bytes to
|
||||
fifo_thresh. Range should be 0-511.
|
||||
|
||||
fifo_starve:
|
||||
When the FIFO has less than this many bytes during a transmit, it
|
||||
enters starve mode, and increases the priority of TX memory
|
||||
transactions. To change, echo the number of bytes to
|
||||
fifo_starve. Range should be 0-511.
|
||||
|
||||
fifo_starve_off:
|
||||
Once in starve mode, the FIFO remains there until it has this
|
||||
many bytes. To change, echo the number of bytes to
|
||||
fifo_starve_off. Range should be 0-511.
|
||||
|
||||
CHECKSUM OFFLOADING
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@ obj-$(CONFIG_FSL_XGMAC_MDIO) += xgmac_mdio.o
|
|||
obj-$(CONFIG_GIANFAR) += gianfar_driver.o
|
||||
obj-$(CONFIG_PTP_1588_CLOCK_GIANFAR) += gianfar_ptp.o
|
||||
gianfar_driver-objs := gianfar.o \
|
||||
gianfar_ethtool.o \
|
||||
gianfar_sysfs.o
|
||||
gianfar_ethtool.o
|
||||
obj-$(CONFIG_UCC_GETH) += ucc_geth_driver.o
|
||||
ucc_geth_driver-objs := ucc_geth.o ucc_geth_ethtool.o
|
||||
|
|
|
@ -338,7 +338,6 @@ static void gfar_init_mac(struct net_device *ndev)
|
|||
struct gfar __iomem *regs = priv->gfargrp[0].regs;
|
||||
u32 rctrl = 0;
|
||||
u32 tctrl = 0;
|
||||
u32 attrs = 0;
|
||||
|
||||
/* write the tx/rx base registers */
|
||||
gfar_init_tx_rx_base(priv);
|
||||
|
@ -409,29 +408,6 @@ static void gfar_init_mac(struct net_device *ndev)
|
|||
}
|
||||
|
||||
gfar_write(®s->tctrl, tctrl);
|
||||
|
||||
/* Set the extraction length and index */
|
||||
attrs = ATTRELI_EL(priv->rx_stash_size) |
|
||||
ATTRELI_EI(priv->rx_stash_index);
|
||||
|
||||
gfar_write(®s->attreli, attrs);
|
||||
|
||||
/* Start with defaults, and add stashing or locking
|
||||
* depending on the approprate variables
|
||||
*/
|
||||
attrs = ATTR_INIT_SETTINGS;
|
||||
|
||||
if (priv->bd_stash_en)
|
||||
attrs |= ATTR_BDSTASH;
|
||||
|
||||
if (priv->rx_stash_size != 0)
|
||||
attrs |= ATTR_BUFSTASH;
|
||||
|
||||
gfar_write(®s->attr, attrs);
|
||||
|
||||
gfar_write(®s->fifo_tx_thr, priv->fifo_threshold);
|
||||
gfar_write(®s->fifo_tx_starve, priv->fifo_starve);
|
||||
gfar_write(®s->fifo_tx_starve_shutoff, priv->fifo_starve_off);
|
||||
}
|
||||
|
||||
static struct net_device_stats *gfar_get_stats(struct net_device *dev)
|
||||
|
@ -784,13 +760,13 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
|
|||
memcpy(dev->dev_addr, mac_addr, ETH_ALEN);
|
||||
|
||||
if (model && !strcasecmp(model, "TSEC"))
|
||||
priv->device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
|
||||
priv->device_flags |= FSL_GIANFAR_DEV_HAS_GIGABIT |
|
||||
FSL_GIANFAR_DEV_HAS_COALESCE |
|
||||
FSL_GIANFAR_DEV_HAS_RMON |
|
||||
FSL_GIANFAR_DEV_HAS_MULTI_INTR;
|
||||
|
||||
if (model && !strcasecmp(model, "eTSEC"))
|
||||
priv->device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
|
||||
priv->device_flags |= FSL_GIANFAR_DEV_HAS_GIGABIT |
|
||||
FSL_GIANFAR_DEV_HAS_COALESCE |
|
||||
FSL_GIANFAR_DEV_HAS_RMON |
|
||||
FSL_GIANFAR_DEV_HAS_MULTI_INTR |
|
||||
|
@ -1030,7 +1006,7 @@ static void gfar_detect_errata(struct gfar_private *priv)
|
|||
static void gfar_hw_init(struct gfar_private *priv)
|
||||
{
|
||||
struct gfar __iomem *regs = priv->gfargrp[0].regs;
|
||||
u32 tempval;
|
||||
u32 tempval, attrs;
|
||||
|
||||
/* Reset MAC layer */
|
||||
gfar_write(®s->maccfg1, MACCFG1_SOFT_RESET);
|
||||
|
@ -1052,6 +1028,30 @@ static void gfar_hw_init(struct gfar_private *priv)
|
|||
/* Initialize ECNTRL */
|
||||
gfar_write(®s->ecntrl, ECNTRL_INIT_SETTINGS);
|
||||
|
||||
/* Set the extraction length and index */
|
||||
attrs = ATTRELI_EL(priv->rx_stash_size) |
|
||||
ATTRELI_EI(priv->rx_stash_index);
|
||||
|
||||
gfar_write(®s->attreli, attrs);
|
||||
|
||||
/* Start with defaults, and add stashing
|
||||
* depending on driver parameters
|
||||
*/
|
||||
attrs = ATTR_INIT_SETTINGS;
|
||||
|
||||
if (priv->bd_stash_en)
|
||||
attrs |= ATTR_BDSTASH;
|
||||
|
||||
if (priv->rx_stash_size != 0)
|
||||
attrs |= ATTR_BUFSTASH;
|
||||
|
||||
gfar_write(®s->attr, attrs);
|
||||
|
||||
/* FIFO configs */
|
||||
gfar_write(®s->fifo_tx_thr, DEFAULT_FIFO_TX_THR);
|
||||
gfar_write(®s->fifo_tx_starve, DEFAULT_FIFO_TX_STARVE);
|
||||
gfar_write(®s->fifo_tx_starve_shutoff, DEFAULT_FIFO_TX_STARVE_OFF);
|
||||
|
||||
/* Program the interrupt steering regs, only for MG devices */
|
||||
if (priv->num_grps > 1)
|
||||
gfar_write_isrg(priv);
|
||||
|
@ -1232,9 +1232,6 @@ static int gfar_probe(struct platform_device *ofdev)
|
|||
/* Initialize the filer table */
|
||||
gfar_init_filer_table(priv);
|
||||
|
||||
/* Create all the sysfs files */
|
||||
gfar_init_sysfs(dev);
|
||||
|
||||
/* Print out the device info */
|
||||
netdev_info(dev, "mac: %pM\n", dev->dev_addr);
|
||||
|
||||
|
|
|
@ -1130,11 +1130,6 @@ struct gfar_private {
|
|||
u32 __iomem *hash_regs[16];
|
||||
int hash_width;
|
||||
|
||||
/* global parameters */
|
||||
unsigned int fifo_threshold;
|
||||
unsigned int fifo_starve;
|
||||
unsigned int fifo_starve_off;
|
||||
|
||||
/*Filer table*/
|
||||
unsigned int ftp_rqfpr[MAX_FILER_IDX + 1];
|
||||
unsigned int ftp_rqfcr[MAX_FILER_IDX + 1];
|
||||
|
@ -1215,7 +1210,6 @@ void gfar_halt(struct net_device *dev);
|
|||
void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev, int enable,
|
||||
u32 regnum, u32 read);
|
||||
void gfar_configure_coalescing_all(struct gfar_private *priv);
|
||||
void gfar_init_sysfs(struct net_device *dev);
|
||||
int gfar_set_features(struct net_device *dev, netdev_features_t features);
|
||||
void gfar_check_rx_parser_mode(struct gfar_private *priv);
|
||||
void gfar_vlan_mode(struct net_device *dev, netdev_features_t features);
|
||||
|
|
|
@ -1,340 +0,0 @@
|
|||
/*
|
||||
* drivers/net/ethernet/freescale/gianfar_sysfs.c
|
||||
*
|
||||
* Gianfar Ethernet Driver
|
||||
* This driver is designed for the non-CPM ethernet controllers
|
||||
* on the 85xx and 83xx family of integrated processors
|
||||
* Based on 8260_io/fcc_enet.c
|
||||
*
|
||||
* Author: Andy Fleming
|
||||
* Maintainer: Kumar Gala (galak@kernel.crashing.org)
|
||||
* Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com>
|
||||
*
|
||||
* Copyright 2002-2009 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Sysfs file creation and management
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "gianfar.h"
|
||||
|
||||
static ssize_t gfar_show_bd_stash(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%s\n", priv->bd_stash_en ? "on" : "off");
|
||||
}
|
||||
|
||||
static ssize_t gfar_set_bd_stash(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;
|
||||
int new_setting = 0;
|
||||
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;
|
||||
else if (!strncmp("off", buf, count - 1) ||
|
||||
!strncmp("0", buf, count - 1))
|
||||
new_setting = 0;
|
||||
else
|
||||
return count;
|
||||
|
||||
|
||||
local_irq_save(flags);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
/* Set the new stashing value */
|
||||
priv->bd_stash_en = new_setting;
|
||||
|
||||
temp = gfar_read(®s->attr);
|
||||
|
||||
if (new_setting)
|
||||
temp |= ATTR_BDSTASH;
|
||||
else
|
||||
temp &= ~(ATTR_BDSTASH);
|
||||
|
||||
gfar_write(®s->attr, temp);
|
||||
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(bd_stash, 0644, gfar_show_bd_stash, gfar_set_bd_stash);
|
||||
|
||||
static ssize_t gfar_show_rx_stash_size(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%d\n", priv->rx_stash_size);
|
||||
}
|
||||
|
||||
static ssize_t gfar_set_rx_stash_size(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 int length = 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 (length > priv->rx_buffer_size)
|
||||
goto out;
|
||||
|
||||
if (length == priv->rx_stash_size)
|
||||
goto out;
|
||||
|
||||
priv->rx_stash_size = length;
|
||||
|
||||
temp = gfar_read(®s->attreli);
|
||||
temp &= ~ATTRELI_EL_MASK;
|
||||
temp |= ATTRELI_EL(length);
|
||||
gfar_write(®s->attreli, temp);
|
||||
|
||||
/* Turn stashing on/off as appropriate */
|
||||
temp = gfar_read(®s->attr);
|
||||
|
||||
if (length)
|
||||
temp |= ATTR_BUFSTASH;
|
||||
else
|
||||
temp &= ~(ATTR_BUFSTASH);
|
||||
|
||||
gfar_write(®s->attr, temp);
|
||||
|
||||
out:
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(rx_stash_size, 0644, gfar_show_rx_stash_size,
|
||||
gfar_set_rx_stash_size);
|
||||
|
||||
/* Stashing will only be enabled when rx_stash_size != 0 */
|
||||
static ssize_t gfar_show_rx_stash_index(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%d\n", priv->rx_stash_index);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(rx_stash_index, 0644, gfar_show_rx_stash_index,
|
||||
gfar_set_rx_stash_index);
|
||||
|
||||
static ssize_t gfar_show_fifo_threshold(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%d\n", priv->fifo_threshold);
|
||||
}
|
||||
|
||||
static ssize_t gfar_set_fifo_threshold(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 int length = simple_strtoul(buf, NULL, 0);
|
||||
u32 temp;
|
||||
unsigned long flags;
|
||||
|
||||
if (length > GFAR_MAX_FIFO_THRESHOLD)
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
priv->fifo_threshold = length;
|
||||
|
||||
temp = gfar_read(®s->fifo_tx_thr);
|
||||
temp &= ~FIFO_TX_THR_MASK;
|
||||
temp |= length;
|
||||
gfar_write(®s->fifo_tx_thr, temp);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(fifo_threshold, 0644, gfar_show_fifo_threshold,
|
||||
gfar_set_fifo_threshold);
|
||||
|
||||
static ssize_t gfar_show_fifo_starve(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%d\n", priv->fifo_starve);
|
||||
}
|
||||
|
||||
static ssize_t gfar_set_fifo_starve(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 int num = simple_strtoul(buf, NULL, 0);
|
||||
u32 temp;
|
||||
unsigned long flags;
|
||||
|
||||
if (num > GFAR_MAX_FIFO_STARVE)
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
priv->fifo_starve = num;
|
||||
|
||||
temp = gfar_read(®s->fifo_tx_starve);
|
||||
temp &= ~FIFO_TX_STARVE_MASK;
|
||||
temp |= num;
|
||||
gfar_write(®s->fifo_tx_starve, temp);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(fifo_starve, 0644, gfar_show_fifo_starve,
|
||||
gfar_set_fifo_starve);
|
||||
|
||||
static ssize_t gfar_show_fifo_starve_off(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%d\n", priv->fifo_starve_off);
|
||||
}
|
||||
|
||||
static ssize_t gfar_set_fifo_starve_off(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 int num = simple_strtoul(buf, NULL, 0);
|
||||
u32 temp;
|
||||
unsigned long flags;
|
||||
|
||||
if (num > GFAR_MAX_FIFO_STARVE_OFF)
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
priv->fifo_starve_off = num;
|
||||
|
||||
temp = gfar_read(®s->fifo_tx_starve_shutoff);
|
||||
temp &= ~FIFO_TX_STARVE_OFF_MASK;
|
||||
temp |= num;
|
||||
gfar_write(®s->fifo_tx_starve_shutoff, temp);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(fifo_starve_off, 0644, gfar_show_fifo_starve_off,
|
||||
gfar_set_fifo_starve_off);
|
||||
|
||||
void gfar_init_sysfs(struct net_device *dev)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
int rc;
|
||||
|
||||
/* Initialize the default values */
|
||||
priv->fifo_threshold = DEFAULT_FIFO_TX_THR;
|
||||
priv->fifo_starve = DEFAULT_FIFO_TX_STARVE;
|
||||
priv->fifo_starve_off = DEFAULT_FIFO_TX_STARVE_OFF;
|
||||
|
||||
/* Create our sysfs files */
|
||||
rc = device_create_file(&dev->dev, &dev_attr_bd_stash);
|
||||
rc |= device_create_file(&dev->dev, &dev_attr_rx_stash_size);
|
||||
rc |= device_create_file(&dev->dev, &dev_attr_rx_stash_index);
|
||||
rc |= device_create_file(&dev->dev, &dev_attr_fifo_threshold);
|
||||
rc |= device_create_file(&dev->dev, &dev_attr_fifo_starve);
|
||||
rc |= device_create_file(&dev->dev, &dev_attr_fifo_starve_off);
|
||||
if (rc)
|
||||
dev_err(&dev->dev, "Error creating gianfar sysfs files\n");
|
||||
}
|
Loading…
Reference in New Issue