2 * drivers/net/gianfar_sysfs.c
4 * Gianfar Ethernet Driver
5 * This driver is designed for the non-CPM ethernet controllers
6 * on the 85xx and 83xx family of integrated processors
7 * Based on 8260_io/fcc_enet.c
10 * Maintainer: Kumar Gala (galak@kernel.crashing.org)
12 * Copyright (c) 2002-2005 Freescale Semiconductor, Inc.
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the
16 * Free Software Foundation; either version 2 of the License, or (at your
17 * option) any later version.
19 * Sysfs file creation and management
22 #include <linux/kernel.h>
23 #include <linux/string.h>
24 #include <linux/errno.h>
25 #include <linux/unistd.h>
26 #include <linux/slab.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/etherdevice.h>
30 #include <linux/spinlock.h>
32 #include <linux/device.h>
34 #include <asm/uaccess.h>
35 #include <linux/module.h>
39 static ssize_t
gfar_show_bd_stash(struct device
*dev
,
40 struct device_attribute
*attr
, char *buf
)
42 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
44 return sprintf(buf
, "%s\n", priv
->bd_stash_en
? "on" : "off");
47 static ssize_t
gfar_set_bd_stash(struct device
*dev
,
48 struct device_attribute
*attr
,
49 const char *buf
, size_t count
)
51 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
56 if (!(priv
->device_flags
& FSL_GIANFAR_DEV_HAS_BD_STASHING
))
59 /* Find out the new setting */
60 if (!strncmp("on", buf
, count
- 1) || !strncmp("1", buf
, count
- 1))
62 else if (!strncmp("off", buf
, count
- 1)
63 || !strncmp("0", buf
, count
- 1))
68 spin_lock_irqsave(&priv
->rxlock
, flags
);
70 /* Set the new stashing value */
71 priv
->bd_stash_en
= new_setting
;
73 temp
= gfar_read(&priv
->regs
->attr
);
78 temp
&= ~(ATTR_BDSTASH
);
80 gfar_write(&priv
->regs
->attr
, temp
);
82 spin_unlock_irqrestore(&priv
->rxlock
, flags
);
87 static DEVICE_ATTR(bd_stash
, 0644, gfar_show_bd_stash
, gfar_set_bd_stash
);
89 static ssize_t
gfar_show_rx_stash_size(struct device
*dev
,
90 struct device_attribute
*attr
, char *buf
)
92 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
94 return sprintf(buf
, "%d\n", priv
->rx_stash_size
);
97 static ssize_t
gfar_set_rx_stash_size(struct device
*dev
,
98 struct device_attribute
*attr
,
99 const char *buf
, size_t count
)
101 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
102 unsigned int length
= simple_strtoul(buf
, NULL
, 0);
106 if (!(priv
->device_flags
& FSL_GIANFAR_DEV_HAS_BUF_STASHING
))
109 spin_lock_irqsave(&priv
->rxlock
, flags
);
110 if (length
> priv
->rx_buffer_size
)
113 if (length
== priv
->rx_stash_size
)
116 priv
->rx_stash_size
= length
;
118 temp
= gfar_read(&priv
->regs
->attreli
);
119 temp
&= ~ATTRELI_EL_MASK
;
120 temp
|= ATTRELI_EL(length
);
121 gfar_write(&priv
->regs
->attreli
, temp
);
123 /* Turn stashing on/off as appropriate */
124 temp
= gfar_read(&priv
->regs
->attr
);
127 temp
|= ATTR_BUFSTASH
;
129 temp
&= ~(ATTR_BUFSTASH
);
131 gfar_write(&priv
->regs
->attr
, temp
);
134 spin_unlock_irqrestore(&priv
->rxlock
, flags
);
139 static DEVICE_ATTR(rx_stash_size
, 0644, gfar_show_rx_stash_size
,
140 gfar_set_rx_stash_size
);
142 /* Stashing will only be enabled when rx_stash_size != 0 */
143 static ssize_t
gfar_show_rx_stash_index(struct device
*dev
,
144 struct device_attribute
*attr
,
147 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
149 return sprintf(buf
, "%d\n", priv
->rx_stash_index
);
152 static ssize_t
gfar_set_rx_stash_index(struct device
*dev
,
153 struct device_attribute
*attr
,
154 const char *buf
, size_t count
)
156 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
157 unsigned short index
= simple_strtoul(buf
, NULL
, 0);
161 if (!(priv
->device_flags
& FSL_GIANFAR_DEV_HAS_BUF_STASHING
))
164 spin_lock_irqsave(&priv
->rxlock
, flags
);
165 if (index
> priv
->rx_stash_size
)
168 if (index
== priv
->rx_stash_index
)
171 priv
->rx_stash_index
= index
;
173 temp
= gfar_read(&priv
->regs
->attreli
);
174 temp
&= ~ATTRELI_EI_MASK
;
175 temp
|= ATTRELI_EI(index
);
176 gfar_write(&priv
->regs
->attreli
, flags
);
179 spin_unlock_irqrestore(&priv
->rxlock
, flags
);
184 static DEVICE_ATTR(rx_stash_index
, 0644, gfar_show_rx_stash_index
,
185 gfar_set_rx_stash_index
);
187 static ssize_t
gfar_show_fifo_threshold(struct device
*dev
,
188 struct device_attribute
*attr
,
191 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
193 return sprintf(buf
, "%d\n", priv
->fifo_threshold
);
196 static ssize_t
gfar_set_fifo_threshold(struct device
*dev
,
197 struct device_attribute
*attr
,
198 const char *buf
, size_t count
)
200 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
201 unsigned int length
= simple_strtoul(buf
, NULL
, 0);
205 if (length
> GFAR_MAX_FIFO_THRESHOLD
)
208 spin_lock_irqsave(&priv
->txlock
, flags
);
210 priv
->fifo_threshold
= length
;
212 temp
= gfar_read(&priv
->regs
->fifo_tx_thr
);
213 temp
&= ~FIFO_TX_THR_MASK
;
215 gfar_write(&priv
->regs
->fifo_tx_thr
, temp
);
217 spin_unlock_irqrestore(&priv
->txlock
, flags
);
222 static DEVICE_ATTR(fifo_threshold
, 0644, gfar_show_fifo_threshold
,
223 gfar_set_fifo_threshold
);
225 static ssize_t
gfar_show_fifo_starve(struct device
*dev
,
226 struct device_attribute
*attr
, char *buf
)
228 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
230 return sprintf(buf
, "%d\n", priv
->fifo_starve
);
233 static ssize_t
gfar_set_fifo_starve(struct device
*dev
,
234 struct device_attribute
*attr
,
235 const char *buf
, size_t count
)
237 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
238 unsigned int num
= simple_strtoul(buf
, NULL
, 0);
242 if (num
> GFAR_MAX_FIFO_STARVE
)
245 spin_lock_irqsave(&priv
->txlock
, flags
);
247 priv
->fifo_starve
= num
;
249 temp
= gfar_read(&priv
->regs
->fifo_tx_starve
);
250 temp
&= ~FIFO_TX_STARVE_MASK
;
252 gfar_write(&priv
->regs
->fifo_tx_starve
, temp
);
254 spin_unlock_irqrestore(&priv
->txlock
, flags
);
259 static DEVICE_ATTR(fifo_starve
, 0644, gfar_show_fifo_starve
,
260 gfar_set_fifo_starve
);
262 static ssize_t
gfar_show_fifo_starve_off(struct device
*dev
,
263 struct device_attribute
*attr
,
266 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
268 return sprintf(buf
, "%d\n", priv
->fifo_starve_off
);
271 static ssize_t
gfar_set_fifo_starve_off(struct device
*dev
,
272 struct device_attribute
*attr
,
273 const char *buf
, size_t count
)
275 struct gfar_private
*priv
= netdev_priv(to_net_dev(dev
));
276 unsigned int num
= simple_strtoul(buf
, NULL
, 0);
280 if (num
> GFAR_MAX_FIFO_STARVE_OFF
)
283 spin_lock_irqsave(&priv
->txlock
, flags
);
285 priv
->fifo_starve_off
= num
;
287 temp
= gfar_read(&priv
->regs
->fifo_tx_starve_shutoff
);
288 temp
&= ~FIFO_TX_STARVE_OFF_MASK
;
290 gfar_write(&priv
->regs
->fifo_tx_starve_shutoff
, temp
);
292 spin_unlock_irqrestore(&priv
->txlock
, flags
);
297 static DEVICE_ATTR(fifo_starve_off
, 0644, gfar_show_fifo_starve_off
,
298 gfar_set_fifo_starve_off
);
300 void gfar_init_sysfs(struct net_device
*dev
)
302 struct gfar_private
*priv
= netdev_priv(dev
);
305 /* Initialize the default values */
306 priv
->fifo_threshold
= DEFAULT_FIFO_TX_THR
;
307 priv
->fifo_starve
= DEFAULT_FIFO_TX_STARVE
;
308 priv
->fifo_starve_off
= DEFAULT_FIFO_TX_STARVE_OFF
;
310 /* Create our sysfs files */
311 rc
= device_create_file(&dev
->dev
, &dev_attr_bd_stash
);
312 rc
|= device_create_file(&dev
->dev
, &dev_attr_rx_stash_size
);
313 rc
|= device_create_file(&dev
->dev
, &dev_attr_rx_stash_index
);
314 rc
|= device_create_file(&dev
->dev
, &dev_attr_fifo_threshold
);
315 rc
|= device_create_file(&dev
->dev
, &dev_attr_fifo_starve
);
316 rc
|= device_create_file(&dev
->dev
, &dev_attr_fifo_starve_off
);
318 dev_err(&dev
->dev
, "Error creating gianfar sysfs files.\n");