Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * drivers/net/gianfar_sysfs.c
  3  *
  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
  8  *
  9  * Author: Andy Fleming
 10  * Maintainer: Kumar Gala (galak@kernel.crashing.org)
 11  *
 12  * Copyright (c) 2002-2005 Freescale Semiconductor, Inc.
 13  *
 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.
 18  *
 19  * Sysfs file creation and management
 20  */
 21 
 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>
 31 #include <linux/mm.h>
 32 #include <linux/device.h>
 33 
 34 #include <asm/uaccess.h>
 35 #include <linux/module.h>
 36 #include <linux/version.h>
 37 
 38 #include "gianfar.h"
 39 
 40 static ssize_t gfar_show_bd_stash(struct device *dev,
 41                                   struct device_attribute *attr, char *buf)
 42 {
 43         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
 44 
 45         return sprintf(buf, "%s\n", priv->bd_stash_en ? "on" : "off");
 46 }
 47 
 48 static ssize_t gfar_set_bd_stash(struct device *dev,
 49                                  struct device_attribute *attr,
 50                                  const char *buf, size_t count)
 51 {
 52         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
 53         int new_setting = 0;
 54         u32 temp;
 55         unsigned long flags;
 56 
 57         /* Find out the new setting */
 58         if (!strncmp("on", buf, count - 1) || !strncmp("1", buf, count - 1))
 59                 new_setting = 1;
 60         else if (!strncmp("off", buf, count - 1)
 61                  || !strncmp("", buf, count - 1))
 62                 new_setting = 0;
 63         else
 64                 return count;
 65 
 66         spin_lock_irqsave(&priv->rxlock, flags);
 67 
 68         /* Set the new stashing value */
 69         priv->bd_stash_en = new_setting;
 70 
 71         temp = gfar_read(&priv->regs->attr);
 72 
 73         if (new_setting)
 74                 temp |= ATTR_BDSTASH;
 75         else
 76                 temp &= ~(ATTR_BDSTASH);
 77 
 78         gfar_write(&priv->regs->attr, temp);
 79 
 80         spin_unlock_irqrestore(&priv->rxlock, flags);
 81 
 82         return count;
 83 }
 84 
 85 DEVICE_ATTR(bd_stash, 0644, gfar_show_bd_stash, gfar_set_bd_stash);
 86 
 87 static ssize_t gfar_show_rx_stash_size(struct device *dev,
 88                                        struct device_attribute *attr, char *buf)
 89 {
 90         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
 91 
 92         return sprintf(buf, "%d\n", priv->rx_stash_size);
 93 }
 94 
 95 static ssize_t gfar_set_rx_stash_size(struct device *dev,
 96                                       struct device_attribute *attr,
 97                                       const char *buf, size_t count)
 98 {
 99         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
100         unsigned int length = simple_strtoul(buf, NULL, 0);
101         u32 temp;
102         unsigned long flags;
103 
104         spin_lock_irqsave(&priv->rxlock, flags);
105         if (length > priv->rx_buffer_size)
106                 return count;
107 
108         if (length == priv->rx_stash_size)
109                 return count;
110 
111         priv->rx_stash_size = length;
112 
113         temp = gfar_read(&priv->regs->attreli);
114         temp &= ~ATTRELI_EL_MASK;
115         temp |= ATTRELI_EL(length);
116         gfar_write(&priv->regs->attreli, temp);
117 
118         /* Turn stashing on/off as appropriate */
119         temp = gfar_read(&priv->regs->attr);
120 
121         if (length)
122                 temp |= ATTR_BUFSTASH;
123         else
124                 temp &= ~(ATTR_BUFSTASH);
125 
126         gfar_write(&priv->regs->attr, temp);
127 
128         spin_unlock_irqrestore(&priv->rxlock, flags);
129 
130         return count;
131 }
132 
133 DEVICE_ATTR(rx_stash_size, 0644, gfar_show_rx_stash_size,
134             gfar_set_rx_stash_size);
135 
136 /* Stashing will only be enabled when rx_stash_size != 0 */
137 static ssize_t gfar_show_rx_stash_index(struct device *dev,
138                                         struct device_attribute *attr,
139                                         char *buf)
140 {
141         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
142 
143         return sprintf(buf, "%d\n", priv->rx_stash_index);
144 }
145 
146 static ssize_t gfar_set_rx_stash_index(struct device *dev,
147                                        struct device_attribute *attr,
148                                        const char *buf, size_t count)
149 {
150         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
151         unsigned short index = simple_strtoul(buf, NULL, 0);
152         u32 temp;
153         unsigned long flags;
154 
155         spin_lock_irqsave(&priv->rxlock, flags);
156         if (index > priv->rx_stash_size)
157                 return count;
158 
159         if (index == priv->rx_stash_index)
160                 return count;
161 
162         priv->rx_stash_index = index;
163 
164         temp = gfar_read(&priv->regs->attreli);
165         temp &= ~ATTRELI_EI_MASK;
166         temp |= ATTRELI_EI(index);
167         gfar_write(&priv->regs->attreli, flags);
168 
169         spin_unlock_irqrestore(&priv->rxlock, flags);
170 
171         return count;
172 }
173 
174 DEVICE_ATTR(rx_stash_index, 0644, gfar_show_rx_stash_index,
175             gfar_set_rx_stash_index);
176 
177 static ssize_t gfar_show_fifo_threshold(struct device *dev,
178                                         struct device_attribute *attr,
179                                         char *buf)
180 {
181         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
182 
183         return sprintf(buf, "%d\n", priv->fifo_threshold);
184 }
185 
186 static ssize_t gfar_set_fifo_threshold(struct device *dev,
187                                        struct device_attribute *attr,
188                                        const char *buf, size_t count)
189 {
190         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
191         unsigned int length = simple_strtoul(buf, NULL, 0);
192         u32 temp;
193         unsigned long flags;
194 
195         if (length > GFAR_MAX_FIFO_THRESHOLD)
196                 return count;
197 
198         spin_lock_irqsave(&priv->txlock, flags);
199 
200         priv->fifo_threshold = length;
201 
202         temp = gfar_read(&priv->regs->fifo_tx_thr);
203         temp &= ~FIFO_TX_THR_MASK;
204         temp |= length;
205         gfar_write(&priv->regs->fifo_tx_thr, temp);
206 
207         spin_unlock_irqrestore(&priv->txlock, flags);
208 
209         return count;
210 }
211 
212 DEVICE_ATTR(fifo_threshold, 0644, gfar_show_fifo_threshold,
213             gfar_set_fifo_threshold);
214 
215 static ssize_t gfar_show_fifo_starve(struct device *dev,
216                                      struct device_attribute *attr, char *buf)
217 {
218         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
219 
220         return sprintf(buf, "%d\n", priv->fifo_starve);
221 }
222 
223 static ssize_t gfar_set_fifo_starve(struct device *dev,
224                                     struct device_attribute *attr,
225                                     const char *buf, size_t count)
226 {
227         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
228         unsigned int num = simple_strtoul(buf, NULL, 0);
229         u32 temp;
230         unsigned long flags;
231 
232         if (num > GFAR_MAX_FIFO_STARVE)
233                 return count;
234 
235         spin_lock_irqsave(&priv->txlock, flags);
236 
237         priv->fifo_starve = num;
238 
239         temp = gfar_read(&priv->regs->fifo_tx_starve);
240         temp &= ~FIFO_TX_STARVE_MASK;
241         temp |= num;
242         gfar_write(&priv->regs->fifo_tx_starve, temp);
243 
244         spin_unlock_irqrestore(&priv->txlock, flags);
245 
246         return count;
247 }
248 
249 DEVICE_ATTR(fifo_starve, 0644, gfar_show_fifo_starve, gfar_set_fifo_starve);
250 
251 static ssize_t gfar_show_fifo_starve_off(struct device *dev,
252                                          struct device_attribute *attr,
253                                          char *buf)
254 {
255         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
256 
257         return sprintf(buf, "%d\n", priv->fifo_starve_off);
258 }
259 
260 static ssize_t gfar_set_fifo_starve_off(struct device *dev,
261                                         struct device_attribute *attr,
262                                         const char *buf, size_t count)
263 {
264         struct gfar_private *priv = netdev_priv(to_net_dev(dev));
265         unsigned int num = simple_strtoul(buf, NULL, 0);
266         u32 temp;
267         unsigned long flags;
268 
269         if (num > GFAR_MAX_FIFO_STARVE_OFF)
270                 return count;
271 
272         spin_lock_irqsave(&priv->txlock, flags);
273 
274         priv->fifo_starve_off = num;
275 
276         temp = gfar_read(&priv->regs->fifo_tx_starve_shutoff);
277         temp &= ~FIFO_TX_STARVE_OFF_MASK;
278         temp |= num;
279         gfar_write(&priv->regs->fifo_tx_starve_shutoff, temp);
280 
281         spin_unlock_irqrestore(&priv->txlock, flags);
282 
283         return count;
284 }
285 
286 DEVICE_ATTR(fifo_starve_off, 0644, gfar_show_fifo_starve_off,
287             gfar_set_fifo_starve_off);
288 
289 void gfar_init_sysfs(struct net_device *dev)
290 {
291         struct gfar_private *priv = netdev_priv(dev);
292         int rc;
293 
294         /* Initialize the default values */
295         priv->rx_stash_size = DEFAULT_STASH_LENGTH;
296         priv->rx_stash_index = DEFAULT_STASH_INDEX;
297         priv->fifo_threshold = DEFAULT_FIFO_TX_THR;
298         priv->fifo_starve = DEFAULT_FIFO_TX_STARVE;
299         priv->fifo_starve_off = DEFAULT_FIFO_TX_STARVE_OFF;
300         priv->bd_stash_en = DEFAULT_BD_STASH;
301 
302         /* Create our sysfs files */
303         rc = device_create_file(&dev->dev, &dev_attr_bd_stash);
304         rc |= device_create_file(&dev->dev, &dev_attr_rx_stash_size);
305         rc |= device_create_file(&dev->dev, &dev_attr_rx_stash_index);
306         rc |= device_create_file(&dev->dev, &dev_attr_fifo_threshold);
307         rc |= device_create_file(&dev->dev, &dev_attr_fifo_starve);
308         rc |= device_create_file(&dev->dev, &dev_attr_fifo_starve_off);
309         if (rc)
310                 dev_err(&dev->dev, "Error creating gianfar sysfs files.\n");
311 }
312 
  This page was automatically generated by the LXR engine.