devices/ccat/netdev-2.6.32-ethercat.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Wed, 23 Apr 2014 13:15:10 +0200
branchstable-1.5
changeset 2552 6e419c23b1b3
permissions -rw-r--r--
added ccat support for kernel 2.6.32
2552
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     1
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     2
    Network Driver for Beckhoff CCAT communication controller
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     3
    Copyright (C) 2014  Beckhoff Automation GmbH
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     4
    Author: Patrick Bruenn <p.bruenn@beckhoff.com>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     5
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     6
    This program is free software; you can redistribute it and/or modify
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     7
    it under the terms of the GNU General Public License as published by
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     8
    the Free Software Foundation; either version 2 of the License, or
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
     9
    (at your option) any later version.
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    10
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    11
    This program is distributed in the hope that it will be useful,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    14
    GNU General Public License for more details.
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    15
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    16
    You should have received a copy of the GNU General Public License along
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    17
    with this program; if not, write to the Free Software Foundation, Inc.,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    18
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    19
*/
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    20
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    21
#include <linux/etherdevice.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    22
#include <linux/init.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    23
#include <linux/kernel.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    24
#include <linux/kfifo.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    25
#include <linux/kthread.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    26
#include <linux/module.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    27
#include <linux/netdevice.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    28
#include <linux/spinlock.h>
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    29
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    30
#include "compat.h"
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    31
#include "module.h"
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    32
#include "netdev.h"
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    33
#include "print.h"
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    34
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    35
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    36
 * EtherCAT frame to enable forwarding on EtherCAT Terminals
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    37
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    38
static const UINT8 frameForwardEthernetFrames[] = {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    39
	0x01, 0x01, 0x05, 0x01, 0x00, 0x00,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    40
	0x00, 0x1b, 0x21, 0x36, 0x1b, 0xce,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    41
	0x88, 0xa4, 0x0e, 0x10,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    42
	0x08,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    43
	0x00,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    44
	0x00, 0x00,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    45
	0x00, 0x01,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    46
	0x02, 0x00,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    47
	0x00, 0x00,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    48
	0x00, 0x00,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    49
	0x00, 0x00
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    50
};
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    51
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    52
#define FIFO_LENGTH 64
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    53
#define DMA_POLL_DELAY_RANGE_USECS 100, 100	/* time to sleep between rx/tx DMA polls */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    54
#define POLL_DELAY_RANGE_USECS 500, 1000	/* time to sleep between link state polls */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    55
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    56
static void ec_poll(struct net_device *dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    57
static int run_poll_thread(void *data);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    58
static int run_rx_thread(void *data);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    59
static int run_tx_thread(void *data);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    60
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    61
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    62
static struct rtnl_link_stats64 *ccat_eth_get_stats64(struct net_device *dev, struct rtnl_link_stats64
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    63
						      *storage);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    64
#endif
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    65
static int ccat_eth_open(struct net_device *dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    66
static netdev_tx_t ccat_eth_start_xmit(struct sk_buff *skb,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    67
				       struct net_device *dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    68
static int ccat_eth_stop(struct net_device *dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    69
static void ccat_eth_xmit_raw(struct net_device *dev, const char *data,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    70
			      size_t len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    71
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    72
static const struct net_device_ops ccat_eth_netdev_ops = {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    73
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    74
	.ndo_get_stats64 = ccat_eth_get_stats64,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    75
#endif
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    76
	.ndo_open = ccat_eth_open,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    77
	.ndo_start_xmit = ccat_eth_start_xmit,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    78
	.ndo_stop = ccat_eth_stop,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    79
};
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    80
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    81
static void ecdev_kfree_skb_any(struct sk_buff *skb)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    82
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    83
	/* never release a skb in EtherCAT mode */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    84
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    85
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    86
static void ecdev_carrier_on(struct net_device *const netdev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    87
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    88
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    89
	ecdev_set_link(priv->ecdev, 1);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    90
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    91
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    92
static void ecdev_carrier_off(struct net_device *const netdev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    93
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    94
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    95
	ecdev_set_link(priv->ecdev, 0);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    96
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    97
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    98
static void ecdev_nop(struct net_device *const netdev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
    99
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   100
	/* dummy called if nothing has to be done in EtherCAT operation mode */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   101
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   102
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   103
static void ecdev_tx_fifo_full(struct net_device *const dev,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   104
			       const struct ccat_eth_frame *const frame)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   105
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   106
	/* we are polled -> there is nothing we can do in EtherCAT mode */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   107
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   108
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   109
static void unregister_ecdev(struct net_device *const netdev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   110
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   111
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   112
	ecdev_close(priv->ecdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   113
	ecdev_withdraw(priv->ecdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   114
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   115
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   116
typedef void (*fifo_add_function) (struct ccat_eth_frame *,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   117
				   struct ccat_eth_dma_fifo *);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   118
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   119
static void ccat_eth_rx_fifo_add(struct ccat_eth_frame *frame,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   120
				 struct ccat_eth_dma_fifo *fifo)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   121
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   122
	const size_t offset = ((void *)(frame) - fifo->dma.virt);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   123
	const uint32_t addr_and_length = (1 << 31) | offset;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   124
	frame->received = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   125
	iowrite32(addr_and_length, fifo->reg);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   126
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   127
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   128
static void ccat_eth_tx_fifo_add_free(struct ccat_eth_frame *frame,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   129
				      struct ccat_eth_dma_fifo *fifo)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   130
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   131
	/* mark frame as ready to use for tx */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   132
	frame->sent = 1;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   133
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   134
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   135
static void ccat_eth_tx_fifo_full(struct net_device *const dev,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   136
				  const struct ccat_eth_frame *const frame)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   137
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   138
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   139
	netif_stop_queue(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   140
	priv->next_tx_frame = frame;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   141
	wake_up_process(priv->tx_thread);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   142
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   143
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   144
static void ccat_eth_dma_fifo_reset(struct ccat_eth_dma_fifo *fifo)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   145
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   146
	struct ccat_eth_frame *frame = fifo->dma.virt;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   147
	const struct ccat_eth_frame *const end = frame + FIFO_LENGTH;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   148
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   149
	/* reset hw fifo */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   150
	iowrite32(0, fifo->reg + 0x8);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   151
	wmb();
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   152
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   153
	if (fifo->add) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   154
		while (frame < end) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   155
			fifo->add(frame, fifo);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   156
			++frame;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   157
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   158
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   159
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   160
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   161
static int ccat_eth_dma_fifo_init(struct ccat_eth_dma_fifo *fifo,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   162
				  void __iomem * const fifo_reg,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   163
				  fifo_add_function add, size_t channel,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   164
				  struct ccat_eth_priv *const priv)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   165
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   166
	if (0 !=
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   167
	    ccat_dma_init(&fifo->dma, channel, priv->ccatdev->bar[2].ioaddr,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   168
			  &priv->ccatdev->pdev->dev)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   169
		pr_info("init DMA%llu memory failed.\n", (uint64_t) channel);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   170
		return -1;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   171
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   172
	fifo->add = add;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   173
	fifo->reg = fifo_reg;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   174
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   175
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   176
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   177
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   178
 * Stop both (Rx/Tx) DMA fifo's and free related management structures
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   179
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   180
static void ccat_eth_priv_free_dma(struct ccat_eth_priv *priv)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   181
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   182
	/* reset hw fifo's */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   183
	iowrite32(0, priv->rx_fifo.reg + 0x8);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   184
	iowrite32(0, priv->tx_fifo.reg + 0x8);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   185
	wmb();
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   186
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   187
	/* release dma */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   188
	ccat_dma_free(&priv->rx_fifo.dma);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   189
	ccat_dma_free(&priv->tx_fifo.dma);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   190
	pr_debug("DMA fifo's stopped.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   191
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   192
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   193
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   194
 * Initalizes both (Rx/Tx) DMA fifo's and related management structures
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   195
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   196
static int ccat_eth_priv_init_dma(struct ccat_eth_priv *priv)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   197
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   198
	if (ccat_eth_dma_fifo_init
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   199
	    (&priv->rx_fifo, priv->reg.rx_fifo, ccat_eth_rx_fifo_add,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   200
	     priv->info.rxDmaChn, priv)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   201
		pr_warn("init Rx DMA fifo failed.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   202
		return -1;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   203
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   204
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   205
	if (ccat_eth_dma_fifo_init
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   206
	    (&priv->tx_fifo, priv->reg.tx_fifo, ccat_eth_tx_fifo_add_free,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   207
	     priv->info.txDmaChn, priv)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   208
		pr_warn("init Tx DMA fifo failed.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   209
		ccat_dma_free(&priv->rx_fifo.dma);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   210
		return -1;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   211
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   212
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   213
	/* disable MAC filter */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   214
	iowrite8(0, priv->reg.mii + 0x8 + 6);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   215
	wmb();
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   216
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   217
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   218
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   219
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   220
 * Initializes the CCat... members of the ccat_eth_priv structure.
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   221
 * Call this function only if info and ioaddr are already initialized!
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   222
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   223
static void ccat_eth_priv_init_mappings(struct ccat_eth_priv *priv)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   224
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   225
	CCatInfoBlockOffs offsets;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   226
	void __iomem *const func_base =
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   227
	    priv->ccatdev->bar[0].ioaddr + priv->info.nAddr;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   228
	memcpy_fromio(&offsets, func_base, sizeof(offsets));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   229
	priv->reg.mii = func_base + offsets.nMMIOffs;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   230
	priv->reg.tx_fifo = func_base + offsets.nTxFifoOffs;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   231
	priv->reg.rx_fifo = func_base + offsets.nTxFifoOffs + 0x10;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   232
	priv->reg.mac = func_base + offsets.nMacRegOffs;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   233
	priv->reg.rx_mem = func_base + offsets.nRxMemOffs;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   234
	priv->reg.tx_mem = func_base + offsets.nTxMemOffs;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   235
	priv->reg.misc = func_base + offsets.nMiscOffs;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   236
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   237
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   238
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   239
 * Read link state from CCAT hardware
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   240
 * @return 1 if link is up, 0 if not
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   241
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   242
inline static size_t ccat_eth_priv_read_link_state(const struct ccat_eth_priv
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   243
						   *const priv)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   244
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   245
	return (1 << 24) == (ioread32(priv->reg.mii + 0x8 + 4) & (1 << 24));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   246
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   247
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   248
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   249
static struct rtnl_link_stats64 *ccat_eth_get_stats64(struct net_device *dev, struct rtnl_link_stats64
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   250
						      *storage)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   251
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   252
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   253
	CCatMacRegs mac;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   254
	memcpy_fromio(&mac, priv->reg.mac, sizeof(mac));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   255
	storage->rx_packets = mac.rxFrameCnt;	/* total packets received       */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   256
	storage->tx_packets = mac.txFrameCnt;	/* total packets transmitted    */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   257
	storage->rx_bytes = atomic64_read(&priv->rx_bytes);	/* total bytes received         */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   258
	storage->tx_bytes = atomic64_read(&priv->tx_bytes);	/* total bytes transmitted      */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   259
	storage->rx_errors = mac.frameLenErrCnt + mac.dropFrameErrCnt + mac.crcErrCnt + mac.rxErrCnt;	/* bad packets received         */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   260
	//TODO __u64    tx_errors;              /* packet transmit problems     */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   261
	storage->rx_dropped = atomic64_read(&priv->rx_dropped);	/* no space in linux buffers    */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   262
	storage->tx_dropped = atomic64_read(&priv->tx_dropped);	/* no space available in linux  */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   263
	//TODO __u64    multicast;              /* multicast packets received   */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   264
	//TODO __u64    collisions;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   265
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   266
	/* detailed rx_errors: */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   267
	storage->rx_length_errors = mac.frameLenErrCnt;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   268
	storage->rx_over_errors = mac.dropFrameErrCnt;	/* receiver ring buff overflow  */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   269
	storage->rx_crc_errors = mac.crcErrCnt;	/* recved pkt with crc error    */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   270
	storage->rx_frame_errors = mac.rxErrCnt;	/* recv'd frame alignment error */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   271
	storage->rx_fifo_errors = mac.dropFrameErrCnt;	/* recv'r fifo overrun          */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   272
	//TODO __u64    rx_missed_errors;       /* receiver missed packet       */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   273
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   274
	/* detailed tx_errors */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   275
	//TODO __u64    tx_aborted_errors;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   276
	//TODO __u64    tx_carrier_errors;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   277
	//TODO __u64    tx_fifo_errors;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   278
	//TODO __u64    tx_heartbeat_errors;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   279
	//TODO __u64    tx_window_errors;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   280
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   281
	/* for cslip etc */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   282
	//TODO __u64    rx_compressed;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   283
	//TODO __u64    tx_compressed;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   284
	return storage;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   285
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   286
#endif
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   287
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   288
struct ccat_eth_priv *ccat_eth_init(const struct ccat_device *const ccatdev,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   289
				    const void __iomem * const addr)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   290
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   291
	struct ccat_eth_priv *priv;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   292
	struct net_device *const netdev = alloc_etherdev(sizeof(*priv));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   293
	priv = netdev_priv(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   294
	priv->netdev = netdev;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   295
	priv->ccatdev = ccatdev;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   296
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   297
	/* ccat register mappings */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   298
	memcpy_fromio(&priv->info, addr, sizeof(priv->info));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   299
	ccat_eth_priv_init_mappings(priv);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   300
	ccat_print_function_info(priv);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   301
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   302
	if (ccat_eth_priv_init_dma(priv)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   303
		pr_warn("%s(): DMA initialization failed.\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   304
		free_netdev(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   305
		return NULL;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   306
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   307
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   308
	/* init netdev with MAC and stack callbacks */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   309
	memcpy_fromio(netdev->dev_addr, priv->reg.mii + 8, 6);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   310
	netdev->netdev_ops = &ccat_eth_netdev_ops;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   311
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   312
	/* use as EtherCAT device? */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   313
	priv->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   314
	if (priv->ecdev) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   315
		priv->carrier_off = ecdev_carrier_off;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   316
		priv->carrier_on = ecdev_carrier_on;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   317
		priv->kfree_skb_any = ecdev_kfree_skb_any;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   318
		priv->start_queue = ecdev_nop;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   319
		priv->stop_queue = ecdev_nop;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   320
		priv->tx_fifo_full = ecdev_tx_fifo_full;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   321
		priv->unregister = unregister_ecdev;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   322
		if (ecdev_open(priv->ecdev)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   323
			pr_info("unable to register network device.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   324
			ecdev_withdraw(priv->ecdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   325
			ccat_eth_priv_free_dma(priv);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   326
			free_netdev(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   327
			return NULL;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   328
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   329
		return priv;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   330
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   331
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   332
	/* EtherCAT disabled -> prepare normal ethernet mode */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   333
	priv->carrier_off = netif_carrier_off;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   334
	priv->carrier_on = netif_carrier_on;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   335
	priv->kfree_skb_any = dev_kfree_skb_any;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   336
	priv->start_queue = netif_start_queue;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   337
	priv->stop_queue = netif_stop_queue;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   338
	priv->tx_fifo_full = ccat_eth_tx_fifo_full;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   339
	priv->unregister = unregister_netdev;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   340
	if (register_netdev(netdev)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   341
		pr_info("unable to register network device.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   342
		ccat_eth_priv_free_dma(priv);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   343
		free_netdev(netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   344
		return NULL;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   345
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   346
	pr_info("registered %s as network device.\n", netdev->name);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   347
	priv->rx_thread = kthread_run(run_rx_thread, netdev, "%s_rx", DRV_NAME);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   348
	priv->tx_thread = kthread_run(run_tx_thread, netdev, "%s_tx", DRV_NAME);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   349
	return priv;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   350
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   351
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   352
void ccat_eth_remove(struct ccat_eth_priv *const priv)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   353
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   354
	if (priv->rx_thread) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   355
		kthread_stop(priv->rx_thread);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   356
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   357
	if (priv->tx_thread) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   358
		kthread_stop(priv->tx_thread);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   359
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   360
	priv->unregister(priv->netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   361
	ccat_eth_priv_free_dma(priv);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   362
	free_netdev(priv->netdev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   363
	pr_debug("%s(): done\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   364
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   365
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   366
static int ccat_eth_open(struct net_device *dev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   367
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   368
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   369
	priv->carrier_off(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   370
	priv->poll_thread =
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   371
	    kthread_run(run_poll_thread, dev, "%s_poll", DRV_NAME);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   372
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   373
	//TODO
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   374
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   375
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   376
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   377
static const size_t CCATRXDESC_HEADER_LEN = 20;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   378
static void ccat_eth_receive(struct net_device *const dev,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   379
			     const struct ccat_eth_frame *const frame)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   380
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   381
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   382
	const size_t len = frame->length - CCATRXDESC_HEADER_LEN;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   383
	struct sk_buff *skb = dev_alloc_skb(len + NET_IP_ALIGN);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   384
	if (!skb) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   385
		pr_info("%s() out of memory :-(\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   386
		atomic64_inc(&priv->rx_dropped);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   387
		return;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   388
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   389
	skb->dev = dev;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   390
	skb_reserve(skb, NET_IP_ALIGN);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   391
	skb_copy_to_linear_data(skb, frame->data, len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   392
	skb_put(skb, len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   393
	skb->protocol = eth_type_trans(skb, dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   394
	skb->ip_summed = CHECKSUM_UNNECESSARY;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   395
	atomic64_add(len, &priv->rx_bytes);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   396
	netif_rx(skb);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   397
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   398
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   399
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   400
 * Rx handler in EtherCAT operation mode
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   401
 * priv->ecdev should always be valid!
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   402
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   403
static void ec_poll(struct net_device *dev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   404
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   405
	static size_t next = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   406
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   407
	struct ccat_eth_frame *frame =
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   408
	    ((struct ccat_eth_frame *)priv->rx_fifo.dma.virt) + next;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   409
	if (frame->received) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   410
		ecdev_receive(priv->ecdev, frame->data,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   411
			      frame->length - CCATRXDESC_HEADER_LEN);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   412
		frame->received = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   413
		ccat_eth_rx_fifo_add(frame, &priv->rx_fifo);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   414
		next = (next + 1) % FIFO_LENGTH;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   415
	} else {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   416
		//TODO dev_warn(&dev->dev, "%s(): frame was not ready\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   417
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   418
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   419
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   420
static netdev_tx_t ccat_eth_start_xmit(struct sk_buff *skb,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   421
				       struct net_device *dev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   422
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   423
	static size_t next = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   424
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   425
	struct ccat_eth_frame *const frame =
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   426
	    ((struct ccat_eth_frame *)priv->tx_fifo.dma.virt);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   427
	uint32_t addr_and_length;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   428
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   429
	if (skb_is_nonlinear(skb)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   430
		pr_warn("Non linear skb not supported -> drop frame.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   431
		atomic64_inc(&priv->tx_dropped);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   432
		priv->kfree_skb_any(skb);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   433
		return NETDEV_TX_OK;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   434
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   435
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   436
	if (skb->len > sizeof(frame->data)) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   437
		pr_warn("skb.len %llu exceeds dma buffer %llu -> drop frame.\n",
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   438
			(uint64_t) skb->len, (uint64_t) sizeof(frame->data));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   439
		atomic64_inc(&priv->tx_dropped);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   440
		priv->kfree_skb_any(skb);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   441
		return NETDEV_TX_OK;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   442
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   443
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   444
	if (!frame[next].sent) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   445
		netdev_err(dev, "BUG! Tx Ring full when queue awake!\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   446
		ccat_eth_tx_fifo_full(dev, &frame[next]);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   447
		return NETDEV_TX_BUSY;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   448
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   449
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   450
	/* prepare frame in DMA memory */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   451
	frame[next].sent = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   452
	frame[next].length = skb->len;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   453
	memcpy(frame[next].data, skb->data, skb->len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   454
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   455
	priv->kfree_skb_any(skb);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   456
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   457
	addr_and_length = 8 + (next * sizeof(*frame));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   458
	addr_and_length +=
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   459
	    ((frame[next].length + CCAT_DMA_FRAME_HEADER_LENGTH) / 8) << 24;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   460
	iowrite32(addr_and_length, priv->reg.tx_fifo);	/* add to DMA fifo */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   461
	atomic64_add(frame[next].length, &priv->tx_bytes);	/* update stats */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   462
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   463
	next = (next + 1) % FIFO_LENGTH;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   464
	/* stop queue if tx ring is full */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   465
	if (!frame[next].sent) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   466
		ccat_eth_tx_fifo_full(dev, &frame[next]);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   467
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   468
	return NETDEV_TX_OK;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   469
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   470
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   471
static int ccat_eth_stop(struct net_device *dev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   472
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   473
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   474
	priv->stop_queue(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   475
	if (priv->poll_thread) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   476
		/* TODO care about smp context? */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   477
		kthread_stop(priv->poll_thread);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   478
		priv->poll_thread = NULL;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   479
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   480
	netdev_info(dev, "stopped.\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   481
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   482
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   483
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   484
static void ccat_eth_link_down(struct net_device *dev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   485
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   486
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   487
	priv->stop_queue(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   488
	priv->carrier_off(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   489
	netdev_info(dev, "NIC Link is Down\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   490
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   491
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   492
static void ccat_eth_link_up(struct net_device *const dev)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   493
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   494
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   495
	netdev_info(dev, "NIC Link is Up\n");
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   496
	/* TODO netdev_info(dev, "NIC Link is Up %u Mbps %s Duplex\n",
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   497
	   speed == SPEED_100 ? 100 : 10,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   498
	   cmd.duplex == DUPLEX_FULL ? "Full" : "Half"); */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   499
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   500
	ccat_eth_dma_fifo_reset(&priv->rx_fifo);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   501
	ccat_eth_dma_fifo_reset(&priv->tx_fifo);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   502
	ccat_eth_xmit_raw(dev, frameForwardEthernetFrames,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   503
			  sizeof(frameForwardEthernetFrames));
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   504
	priv->carrier_on(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   505
	priv->start_queue(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   506
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   507
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   508
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   509
 * Function to transmit a raw buffer to the network (f.e. frameForwardEthernetFrames)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   510
 * @dev a valid net_device
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   511
 * @data pointer to your raw buffer
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   512
 * @len number of bytes in the raw buffer to transmit
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   513
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   514
static void ccat_eth_xmit_raw(struct net_device *dev, const char *const data,
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   515
			      size_t len)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   516
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   517
	struct sk_buff *skb = dev_alloc_skb(len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   518
	skb->dev = dev;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   519
	skb_copy_to_linear_data(skb, data, len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   520
	skb_put(skb, len);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   521
	ccat_eth_start_xmit(skb, dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   522
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   523
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   524
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   525
 * Since CCAT doesn't support interrupts until now, we have to poll
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   526
 * some status bits to recognize things like link change etc.
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   527
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   528
static int run_poll_thread(void *data)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   529
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   530
	struct net_device *const dev = (struct net_device *)data;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   531
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   532
	size_t link = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   533
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   534
	while (!kthread_should_stop()) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   535
		if (ccat_eth_priv_read_link_state(priv) != link) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   536
			link = !link;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   537
			link ? ccat_eth_link_up(dev) : ccat_eth_link_down(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   538
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   539
		usleep_range(POLL_DELAY_RANGE_USECS);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   540
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   541
	pr_debug("%s() stopped.\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   542
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   543
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   544
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   545
static int run_rx_thread(void *data)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   546
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   547
	struct net_device *const dev = (struct net_device *)data;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   548
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   549
	struct ccat_eth_frame *frame = priv->rx_fifo.dma.virt;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   550
	const struct ccat_eth_frame *const end = frame + FIFO_LENGTH;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   551
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   552
	while (!kthread_should_stop()) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   553
		/* wait until frame was used by DMA for Rx */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   554
		while (!kthread_should_stop() && !frame->received) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   555
			usleep_range(DMA_POLL_DELAY_RANGE_USECS);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   556
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   557
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   558
		/* can be NULL, if we are asked to stop! */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   559
		if (frame->received) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   560
			ccat_eth_receive(dev, frame);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   561
			frame->received = 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   562
			ccat_eth_rx_fifo_add(frame, &priv->rx_fifo);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   563
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   564
		if (++frame >= end) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   565
			frame = priv->rx_fifo.dma.virt;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   566
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   567
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   568
	pr_debug("%s() stopped.\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   569
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   570
}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   571
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   572
/**
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   573
 * Polling of tx dma descriptors in ethernet operating mode
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   574
 */
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   575
static int run_tx_thread(void *data)
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   576
{
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   577
	struct net_device *const dev = (struct net_device *)data;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   578
	struct ccat_eth_priv *const priv = netdev_priv(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   579
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   580
	set_current_state(TASK_INTERRUPTIBLE);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   581
	while (!kthread_should_stop()) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   582
		const struct ccat_eth_frame *const frame = priv->next_tx_frame;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   583
		if (frame) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   584
			while (!kthread_should_stop() && !frame->sent) {
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   585
				usleep_range(DMA_POLL_DELAY_RANGE_USECS);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   586
			}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   587
		}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   588
		netif_wake_queue(dev);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   589
		schedule();
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   590
		set_current_state(TASK_INTERRUPTIBLE);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   591
	}
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   592
	set_current_state(TASK_RUNNING);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   593
	pr_debug("%s() stopped.\n", __FUNCTION__);
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   594
	return 0;
6e419c23b1b3 added ccat support for kernel 2.6.32
Patrick Bruenn <p.bruenn@beckhoff.com>
parents:
diff changeset
   595
}