summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Schodet2012-11-20 14:58:03 +0100
committerNicolas Schodet2012-11-29 17:02:52 +0100
commita35983d59add383e7c6a3aed75c370a028208889 (patch)
tree1f521d52386536b22f811d6fdc5633d529e404c3
parent2d81d5a59a3434d962495190eab95c8dd0cf0bf9 (diff)
cleo/devkit/plcdrv: add proc entry to disable QoS, closes #3527
-rw-r--r--cleopatre/devkit/plcdrv/inc/qos.h8
-rw-r--r--cleopatre/devkit/plcdrv/src/plcdrv.c68
2 files changed, 75 insertions, 1 deletions
diff --git a/cleopatre/devkit/plcdrv/inc/qos.h b/cleopatre/devkit/plcdrv/inc/qos.h
index 96f57808a4..1714498dd0 100644
--- a/cleopatre/devkit/plcdrv/inc/qos.h
+++ b/cleopatre/devkit/plcdrv/inc/qos.h
@@ -49,6 +49,8 @@ typedef enum
/** QOS context. */
typedef struct
{
+ /** Set to 1 to completely disable QOS. */
+ int disabled;
/** Current service type for TX frames. */
qos_service_type_t service_type;
/** Matching rules used depending of service type. */
@@ -67,8 +69,12 @@ typedef struct
static inline unsigned int
qos_frame_prio_get (qos_t *qos, struct sk_buff *skb)
{
+ const struct ethhdr *eth;
+ /* If disabled, always return the same value. */
+ if (qos->disabled)
+ return QOS_FRAME_PRIO_DEFAULT;
/* If MME, raise priority. */
- const struct ethhdr *eth = (const struct ethhdr *) skb->data;
+ eth = (const struct ethhdr *) skb->data;
if (eth->h_proto == htons (ETH_P_HPAV))
return QOS_FRAME_PRIO_MME;
/* Else, look at service type. */
diff --git a/cleopatre/devkit/plcdrv/src/plcdrv.c b/cleopatre/devkit/plcdrv/src/plcdrv.c
index f6a6861785..48cef51457 100644
--- a/cleopatre/devkit/plcdrv/src/plcdrv.c
+++ b/cleopatre/devkit/plcdrv/src/plcdrv.c
@@ -25,6 +25,7 @@
#include <linux/netlink.h>
#include <linux/poll.h>
#include <linux/wait.h>
+#include <linux/ctype.h>
#include <net/seq_check.h>
#include <asm/arch/nvram.h>
@@ -265,6 +266,64 @@ plcdrv_writeproc_set_mark (struct file *file, const char *buffer,
}
/**
+ * Read boolean flag.
+ * \param page buffer to write data to
+ * \param start unused
+ * \param offset unused
+ * \param count unused
+ * \param eof to be set if end of file reached
+ * \param data priv structure
+ * \return number of read bytes
+ */
+static int
+plcdrv_readproc_bool (char *page, char **start, off_t offset, int count,
+ int *eof, void *data)
+{
+ int *v = data;
+ char *p = page;
+ p += sprintf (p, "%d\n", *v);
+ *eof = 1;
+ return p - page;
+}
+
+/**
+ * Write boolean flag.
+ * \param file unused
+ * \param buffer user space buffer
+ * \param count buffer length
+ * \param data priv structure
+ * \return error or number of written bytes
+ */
+static int
+plcdrv_writeproc_bool (struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ unsigned long left;
+ int *v = data;
+ const char *s = buffer;
+ int set = 0;
+ for (left = count; left; left--, s++)
+ {
+ char c;
+ if (get_user (c, s))
+ return -EFAULT;
+ if (!isspace (c))
+ {
+ if (!set && (c == '0' || c == '1'))
+ {
+ *v = c - '0';
+ set = 1;
+ }
+ else
+ return -EINVAL;
+ }
+ }
+ if (!set)
+ return -EINVAL;
+ return count;
+}
+
+/**
* Set/Unset Reset the Leon processor.
* \param activate true to activate reset
* \return error code
@@ -836,6 +895,7 @@ plcdrv_uninit (struct net_device *dev)
unregister_chrdev_region (priv->dev_number, 2);
/* Remove proc. */
+ remove_proc_entry ("qos_disabled", priv->proc_dir_plc);
remove_proc_entry ("set_mark", priv->proc_dir_plc);
remove_proc_entry ("stats", priv->proc_dir_plc);
remove_proc_entry ("version", priv->proc_dir_plc);
@@ -907,6 +967,14 @@ plcdrv_init (struct net_device *dev)
entry->write_proc = plcdrv_writeproc_set_mark;
entry->data = priv;
}
+ entry = create_proc_entry ("qos_disabled", S_IRUGO | S_IWUSR,
+ priv->proc_dir_plc);
+ if (entry)
+ {
+ entry->read_proc = plcdrv_readproc_bool;
+ entry->write_proc = plcdrv_writeproc_bool;
+ entry->data = &priv->qos.disabled;
+ }
/* Set Leon code base address (translation). */
leon_start_addr_ptr = (uint32_t *) ioremap (RB_LEON_ADD_START, 1);