summaryrefslogtreecommitdiff
path: root/cleopatre/devkit/plcdrv/src
diff options
context:
space:
mode:
authorNicolas Schodet2012-01-26 10:23:25 +0100
committerNicolas Schodet2012-02-20 10:08:51 +0100
commit168d0ed79b2e4ee413e7f7682d4cd8ae42252e60 (patch)
treeeb81fe2410d355701b46ce5c29271fb96858aae9 /cleopatre/devkit/plcdrv/src
parentf97296910e8cda8bd0bc1b352a4ab58bad6414b2 (diff)
cleo/devkit/plcdrv: add service type based priority, refs #2595
Diffstat (limited to 'cleopatre/devkit/plcdrv/src')
-rw-r--r--cleopatre/devkit/plcdrv/src/frame.c35
-rw-r--r--cleopatre/devkit/plcdrv/src/plcdrv.c33
2 files changed, 35 insertions, 33 deletions
diff --git a/cleopatre/devkit/plcdrv/src/frame.c b/cleopatre/devkit/plcdrv/src/frame.c
index 5f19eaaaa9..3673f1c9c2 100644
--- a/cleopatre/devkit/plcdrv/src/frame.c
+++ b/cleopatre/devkit/plcdrv/src/frame.c
@@ -16,7 +16,6 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/wait.h>
-#include <linux/if_vlan.h>
#include <linux/if_ether.h>
#include <linux/dma-mapping.h>
#include <linux/netlink.h>
@@ -39,17 +38,6 @@
#define HPAV_MME_P_DRV_BASE 0xB000
-/** Define VLAN format */
-#define VLAN_CFI_MASK 0x1000
-#define VLAN_PRIO_MASK 0xe000
-#define VLAN_VID_SHIFT 0
-#define VLAN_CFI_SHIFT 12
-#define VLAN_PRIO_SHIFT 13
-
-#define VLAN_PRIO(tci) ((tci & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT)
-#define VLAN_MAX_PRIO 7
-#define VLAN_MME_PRIO 6 /** VLAN priorities 6 and 7 correspond to CAP 3. */
-
/** Frame info magic word. */
#define FRAME_INFO_MAGIC 0xc742a74e
@@ -84,18 +72,6 @@ frame_get_eth_mme_type (uint8_t *eth_frame)
}
/**
- * Find the Ethernet type.
- * \param eth_frame Ethernet frame pointer.
- * \return Ethernet type.
- */
-static inline uint16_t
-frame_get_eth_type (uint8_t *eth_frame)
-{
- struct ethhdr *eth = (struct ethhdr *) eth_frame;
- return ntohs (eth->h_proto);
-}
-
-/**
* Prepare a sk buff for sending to firmware.
* \param priv PLC device private context
* \param skb sk buff to send to firmware
@@ -340,8 +316,7 @@ frame_rx_debug_dump (plcdrv_t *priv, uint32_t data_addr,
int
frame_tx_data (struct sk_buff *skb, struct net_device *dev)
{
- uint16_t eth_type;
- unsigned int vlan_prio = 0;
+ unsigned short vlan_prio;
uint32_t phy_addr;
plcdrv_t *priv = netdev_priv (dev);
@@ -360,13 +335,7 @@ frame_tx_data (struct sk_buff *skb, struct net_device *dev)
seq_check_tx (&priv->seq_check_ctx, skb);
/* Get VLAN priority. */
- eth_type = frame_get_eth_type ((uint8_t *) skb->data);
- if (eth_type == ETH_P_8021Q)
- vlan_prio
- = (unsigned int) VLAN_PRIO (ntohs (((struct vlan_ethhdr *)
- skb->data)->h_vlan_TCI));
- else if (eth_type == ETH_P_HPAV)
- vlan_prio = VLAN_MME_PRIO;
+ vlan_prio = qos_frame_prio_get (&priv->qos, skb);
/* TX pool full? This can not happen because netif queue would have been
* stopped before data queue is full. */
diff --git a/cleopatre/devkit/plcdrv/src/plcdrv.c b/cleopatre/devkit/plcdrv/src/plcdrv.c
index a78386ea46..375ba770a5 100644
--- a/cleopatre/devkit/plcdrv/src/plcdrv.c
+++ b/cleopatre/devkit/plcdrv/src/plcdrv.c
@@ -539,12 +539,45 @@ plcdrv_set_mac_address (struct net_device *dev, void *p)
static int
plcdrv_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
{
+ int i;
plcdrv_t *priv = netdev_priv (dev);
struct plcdrv_setpid user_data;
+ plcdrv_qos_rules_t qos_rules;
+ qos_service_type_t qos_service_type;
/* Find the command. */
switch (cmd)
{
+ case PLCDRV_IOCTL_SETQOS_RULES:
+ /* Get user data */
+ if (copy_from_user (&qos_rules, ifr->ifr_data,
+ sizeof (plcdrv_qos_rules_t)))
+ return -EFAULT;
+ /* Check user provided rules. */
+ if (qos_rules.rules_nb > PLCDRV_SERVICES_MAX_NB)
+ return -EINVAL;
+ for (i = 0; i < qos_rules.rules_nb; i++)
+ {
+ if (qos_rules.rules[i].packet_prio
+ > (VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT))
+ return -EINVAL;
+ }
+ /* Copy to context. */
+ priv->qos.rules = qos_rules;
+ break;
+
+ case PLCDRV_IOCTL_SETQOS_TYPE:
+ /* Get user data */
+ if (copy_from_user (&qos_service_type, ifr->ifr_data,
+ sizeof (qos_service_type_t)))
+ return -EFAULT;
+ /* Check user provided data. */
+ if (qos_service_type >= QOS_SERVICE_TYPE_NB)
+ return -EINVAL;
+ /* Copy to context. */
+ priv->qos.service_type = qos_service_type;
+ break;
+
case PLCDRV_IOCTL_SETPID:
/* Get user data */
if (copy_from_user (&user_data, ifr->ifr_data, sizeof (user_data)))