devices/ccat/netdev.c
author Florian Pose <fp@igh-essen.com>
Thu, 19 Feb 2015 15:19:29 +0100
branchstable-1.5
changeset 2599 4b0b906df1b4
parent 2578 d707b650fa52
child 2636 0613017547fe
permissions -rw-r--r--
Fixed bug concerning netdev_completed_queue(); thanks to B. Benner.
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     1
/**
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     2
    Network Driver for Beckhoff CCAT communication controller
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     3
    Copyright (C) 2014  Beckhoff Automation GmbH
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     4
    Author: Patrick Bruenn <p.bruenn@beckhoff.com>
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     5
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     6
    This program is free software; you can redistribute it and/or modify
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     7
    it under the terms of the GNU General Public License as published by
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     8
    the Free Software Foundation; either version 2 of the License, or
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
     9
    (at your option) any later version.
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    10
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    11
    This program is distributed in the hope that it will be useful,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    14
    GNU General Public License for more details.
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    15
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    16
    You should have received a copy of the GNU General Public License along
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    17
    with this program; if not, write to the Free Software Foundation, Inc.,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    18
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    19
*/
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    20
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    21
#include <linux/etherdevice.h>
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    22
#include <linux/kernel.h>
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    23
#include <linux/module.h>
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    24
#include <linux/netdevice.h>
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    25
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    26
#include "module.h"
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    27
#include "netdev.h"
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    28
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    29
/**
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    30
 * EtherCAT frame to enable forwarding on EtherCAT Terminals
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    31
 */
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
    32
static const u8 frameForwardEthernetFrames[] = {
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    33
	0x01, 0x01, 0x05, 0x01, 0x00, 0x00,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    34
	0x00, 0x1b, 0x21, 0x36, 0x1b, 0xce,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    35
	0x88, 0xa4, 0x0e, 0x10,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    36
	0x08,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    37
	0x00,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    38
	0x00, 0x00,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    39
	0x00, 0x01,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    40
	0x02, 0x00,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    41
	0x00, 0x00,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    42
	0x00, 0x00,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    43
	0x00, 0x00
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    44
};
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    45
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    46
#define FIFO_LENGTH 64
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    47
#define POLL_TIME ktime_set(0, 100 * NSEC_PER_USEC)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    48
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    49
/**
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    50
 * Helper to check if frame in tx dma memory was already marked as sent by CCAT
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    51
 */
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    52
static inline bool ccat_eth_frame_sent(const struct ccat_eth_frame *const frame)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    53
{
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    54
	return le32_to_cpu(frame->tx_flags) & CCAT_FRAME_SENT;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    55
}
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    56
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    57
/**
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    58
 * Helper to check if frame in tx dma memory was already marked as sent by CCAT
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    59
 */
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    60
static inline bool ccat_eth_frame_received(const struct ccat_eth_frame *const
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    61
					   frame)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    62
{
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    63
	return le32_to_cpu(frame->rx_flags) & CCAT_FRAME_RECEIVED;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
    64
}
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    65
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    66
static void ecdev_kfree_skb_any(struct sk_buff *skb)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    67
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    68
	/* never release a skb in EtherCAT mode */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    69
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    70
2570
144e11d93e99 - don't use compat.h in the mainline driver
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2569
diff changeset
    71
static bool ecdev_carrier_ok(const struct net_device *const netdev)
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
    72
{
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
    73
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
    74
	return ecdev_get_link(priv->ecdev);
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
    75
}
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
    76
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    77
static void ecdev_carrier_on(struct net_device *const netdev)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    78
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    79
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    80
	ecdev_set_link(priv->ecdev, 1);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    81
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    82
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    83
static void ecdev_carrier_off(struct net_device *const netdev)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    84
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    85
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    86
	ecdev_set_link(priv->ecdev, 0);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    87
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    88
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    89
static void ecdev_nop(struct net_device *const netdev)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    90
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    91
	/* dummy called if nothing has to be done in EtherCAT operation mode */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    92
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    93
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    94
static void unregister_ecdev(struct net_device *const netdev)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    95
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    96
	struct ccat_eth_priv *const priv = netdev_priv(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    97
	ecdev_close(priv->ecdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    98
	ecdev_withdraw(priv->ecdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
    99
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   100
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   101
static void ccat_eth_fifo_inc(struct ccat_eth_dma_fifo *fifo)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   102
{
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   103
	if (++fifo->next >= fifo->end)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   104
		fifo->next = fifo->dma.virt;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   105
}
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   106
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   107
typedef void (*fifo_add_function) (struct ccat_eth_dma_fifo *,
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   108
				   struct ccat_eth_frame *);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   109
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   110
static void ccat_eth_rx_fifo_add(struct ccat_eth_dma_fifo *fifo,
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   111
				 struct ccat_eth_frame *frame)
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   112
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   113
	const size_t offset = ((void *)(frame) - fifo->dma.virt);
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   114
	const u32 addr_and_length = (1 << 31) | offset;
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   115
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   116
	frame->rx_flags = cpu_to_le32(0);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   117
	iowrite32(addr_and_length, fifo->reg);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   118
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   119
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   120
static void ccat_eth_tx_fifo_add_free(struct ccat_eth_dma_fifo *fifo,
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   121
				      struct ccat_eth_frame *frame)
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   122
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   123
	/* mark frame as ready to use for tx */
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   124
	frame->tx_flags = cpu_to_le32(CCAT_FRAME_SENT);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   125
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   126
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   127
static void ccat_eth_dma_fifo_reset(struct ccat_eth_dma_fifo *fifo)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   128
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   129
	/* reset hw fifo */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   130
	iowrite32(0, fifo->reg + 0x8);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   131
	wmb();
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   132
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   133
	if (fifo->add) {
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   134
		fifo->next = fifo->dma.virt;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   135
		do {
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   136
			fifo->add(fifo, fifo->next);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   137
			ccat_eth_fifo_inc(fifo);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   138
		} while (fifo->next != fifo->dma.virt);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   139
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   140
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   141
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   142
static int ccat_eth_dma_fifo_init(struct ccat_eth_dma_fifo *fifo,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   143
				  void __iomem * const fifo_reg,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   144
				  fifo_add_function add, size_t channel,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   145
				  struct ccat_eth_priv *const priv)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   146
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   147
	if (0 !=
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   148
	    ccat_dma_init(&fifo->dma, channel, priv->ccatdev->bar[2].ioaddr,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   149
			  &priv->ccatdev->pdev->dev)) {
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   150
		pr_info("init DMA%llu memory failed.\n", (u64) channel);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   151
		return -1;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   152
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   153
	fifo->add = add;
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   154
	fifo->end = ((struct ccat_eth_frame *)fifo->dma.virt) + FIFO_LENGTH;
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   155
	fifo->reg = fifo_reg;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   156
	return 0;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   157
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   158
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   159
/**
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   160
 * Stop both (Rx/Tx) DMA fifo's and free related management structures
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   161
 */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   162
static void ccat_eth_priv_free_dma(struct ccat_eth_priv *priv)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   163
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   164
	/* reset hw fifo's */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   165
	iowrite32(0, priv->rx_fifo.reg + 0x8);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   166
	iowrite32(0, priv->tx_fifo.reg + 0x8);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   167
	wmb();
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   168
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   169
	/* release dma */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   170
	ccat_dma_free(&priv->rx_fifo.dma);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   171
	ccat_dma_free(&priv->tx_fifo.dma);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   172
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   173
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   174
/**
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   175
 * Initalizes both (Rx/Tx) DMA fifo's and related management structures
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   176
 */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   177
static int ccat_eth_priv_init_dma(struct ccat_eth_priv *priv)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   178
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   179
	if (ccat_eth_dma_fifo_init
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   180
	    (&priv->rx_fifo, priv->reg.rx_fifo, ccat_eth_rx_fifo_add,
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   181
	     priv->info.rx_dma_chan, priv)) {
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   182
		pr_warn("init Rx DMA fifo failed.\n");
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   183
		return -1;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   184
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   185
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   186
	if (ccat_eth_dma_fifo_init
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   187
	    (&priv->tx_fifo, priv->reg.tx_fifo, ccat_eth_tx_fifo_add_free,
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   188
	     priv->info.tx_dma_chan, priv)) {
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   189
		pr_warn("init Tx DMA fifo failed.\n");
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   190
		ccat_dma_free(&priv->rx_fifo.dma);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   191
		return -1;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   192
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   193
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   194
	/* disable MAC filter */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   195
	iowrite8(0, priv->reg.mii + 0x8 + 6);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   196
	wmb();
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   197
	return 0;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   198
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   199
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   200
/**
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   201
 * Initializes the CCat... members of the ccat_eth_priv structure.
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   202
 * Call this function only if info and ioaddr are already initialized!
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   203
 */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   204
static void ccat_eth_priv_init_mappings(struct ccat_eth_priv *priv)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   205
{
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   206
	struct ccat_mac_infoblock offsets;
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   207
	void __iomem *const func_base =
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   208
	    priv->ccatdev->bar[0].ioaddr + priv->info.addr;
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   209
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   210
	memcpy_fromio(&offsets, func_base, sizeof(offsets));
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   211
	priv->reg.mii = func_base + offsets.mii;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   212
	priv->reg.tx_fifo = func_base + offsets.tx_fifo;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   213
	priv->reg.rx_fifo = func_base + offsets.tx_fifo + 0x10;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   214
	priv->reg.mac = func_base + offsets.mac;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   215
	priv->reg.rx_mem = func_base + offsets.rx_mem;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   216
	priv->reg.tx_mem = func_base + offsets.tx_mem;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   217
	priv->reg.misc = func_base + offsets.misc;
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   218
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   219
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   220
static netdev_tx_t ccat_eth_start_xmit(struct sk_buff *skb,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   221
				       struct net_device *dev)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   222
{
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   223
	struct ccat_eth_priv *const priv = netdev_priv(dev);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   224
	struct ccat_eth_dma_fifo *const fifo = &priv->tx_fifo;
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   225
	u32 addr_and_length;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   226
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   227
	if (skb_is_nonlinear(skb)) {
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   228
		pr_warn("Non linear skb not supported -> drop frame.\n");
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   229
		atomic64_inc(&priv->tx_dropped);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   230
		priv->kfree_skb_any(skb);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   231
		return NETDEV_TX_OK;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   232
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   233
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   234
	if (skb->len > sizeof(fifo->next->data)) {
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   235
		pr_warn("skb.len %llu exceeds dma buffer %llu -> drop frame.\n",
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   236
			(u64) skb->len, (u64) sizeof(fifo->next->data));
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   237
		atomic64_inc(&priv->tx_dropped);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   238
		priv->kfree_skb_any(skb);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   239
		return NETDEV_TX_OK;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   240
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   241
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   242
	if (!ccat_eth_frame_sent(fifo->next)) {
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   243
		netdev_err(dev, "BUG! Tx Ring full when queue awake!\n");
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   244
		priv->stop_queue(priv->netdev);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   245
		return NETDEV_TX_BUSY;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   246
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   247
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   248
	/* prepare frame in DMA memory */
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   249
	fifo->next->tx_flags = cpu_to_le32(0);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   250
	fifo->next->length = cpu_to_le16(skb->len);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   251
	memcpy(fifo->next->data, skb->data, skb->len);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   252
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   253
	/* Queue frame into CCAT TX-FIFO, CCAT ignores the first 8 bytes of the tx descriptor */
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   254
	addr_and_length = offsetof(struct ccat_eth_frame, length);
2578
d707b650fa52 - increase version number to 0.10
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2576
diff changeset
   255
	addr_and_length += ((void *)fifo->next - fifo->dma.virt);
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   256
	addr_and_length += ((skb->len + CCAT_ETH_FRAME_HEAD_LEN) / 8) << 24;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   257
	iowrite32(addr_and_length, priv->reg.tx_fifo);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   258
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   259
	/* update stats */
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   260
	atomic64_add(skb->len, &priv->tx_bytes);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   261
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   262
	priv->kfree_skb_any(skb);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   263
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   264
	ccat_eth_fifo_inc(fifo);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   265
	/* stop queue if tx ring is full */
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   266
	if (!ccat_eth_frame_sent(fifo->next)) {
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   267
		priv->stop_queue(priv->netdev);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   268
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   269
	return NETDEV_TX_OK;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   270
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   271
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   272
/**
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   273
 * Function to transmit a raw buffer to the network (f.e. frameForwardEthernetFrames)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   274
 * @dev a valid net_device
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   275
 * @data pointer to your raw buffer
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   276
 * @len number of bytes in the raw buffer to transmit
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   277
 */
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   278
static void ccat_eth_xmit_raw(struct net_device *dev, const char *const data,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   279
			      size_t len)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   280
{
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   281
	struct sk_buff *skb = dev_alloc_skb(len);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   282
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   283
	skb->dev = dev;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   284
	skb_copy_to_linear_data(skb, data, len);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   285
	skb_put(skb, len);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   286
	ccat_eth_start_xmit(skb, dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   287
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   288
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   289
static void ccat_eth_receive(struct net_device *const dev,
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   290
			     const void *const data, const size_t len)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   291
{
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   292
	struct sk_buff *const skb = dev_alloc_skb(len + NET_IP_ALIGN);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   293
	struct ccat_eth_priv *const priv = netdev_priv(dev);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   294
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   295
	if (!skb) {
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   296
		pr_info("%s() out of memory :-(\n", __FUNCTION__);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   297
		atomic64_inc(&priv->rx_dropped);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   298
		return;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   299
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   300
	skb->dev = dev;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   301
	skb_reserve(skb, NET_IP_ALIGN);
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   302
	skb_copy_to_linear_data(skb, data, len);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   303
	skb_put(skb, len);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   304
	skb->protocol = eth_type_trans(skb, dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   305
	skb->ip_summed = CHECKSUM_UNNECESSARY;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   306
	atomic64_add(len, &priv->rx_bytes);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   307
	netif_rx(skb);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   308
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   309
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   310
static void ccat_eth_link_down(struct net_device *const dev)
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   311
{
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   312
	struct ccat_eth_priv *const priv = netdev_priv(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   313
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   314
	priv->stop_queue(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   315
	priv->carrier_off(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   316
	netdev_info(dev, "NIC Link is Down\n");
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   317
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   318
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   319
static void ccat_eth_link_up(struct net_device *const dev)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   320
{
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   321
	struct ccat_eth_priv *const priv = netdev_priv(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   322
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   323
	netdev_info(dev, "NIC Link is Up\n");
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   324
	/* TODO netdev_info(dev, "NIC Link is Up %u Mbps %s Duplex\n",
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   325
	   speed == SPEED_100 ? 100 : 10,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   326
	   cmd.duplex == DUPLEX_FULL ? "Full" : "Half"); */
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   327
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   328
	ccat_eth_dma_fifo_reset(&priv->rx_fifo);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   329
	ccat_eth_dma_fifo_reset(&priv->tx_fifo);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   330
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   331
	/* TODO reset CCAT MAC register */
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   332
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   333
	ccat_eth_xmit_raw(dev, frameForwardEthernetFrames,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   334
			  sizeof(frameForwardEthernetFrames));
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   335
	priv->carrier_on(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   336
	priv->start_queue(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   337
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   338
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   339
/**
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   340
 * Read link state from CCAT hardware
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   341
 * @return 1 if link is up, 0 if not
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   342
 */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   343
inline static size_t ccat_eth_priv_read_link_state(const struct ccat_eth_priv
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   344
						   *const priv)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   345
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   346
	return (1 << 24) == (ioread32(priv->reg.mii + 0x8 + 4) & (1 << 24));
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   347
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   348
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   349
/**
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   350
 * Poll for link state changes
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   351
 */
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   352
static void poll_link(struct ccat_eth_priv *const priv)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   353
{
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   354
	const size_t link = ccat_eth_priv_read_link_state(priv);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   355
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   356
	if (link != priv->carrier_ok(priv->netdev)) {
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   357
		if (link)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   358
			ccat_eth_link_up(priv->netdev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   359
		else
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   360
			ccat_eth_link_down(priv->netdev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   361
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   362
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   363
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   364
/**
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   365
 * Poll for available rx dma descriptors in ethernet operating mode
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   366
 */
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   367
static void poll_rx(struct ccat_eth_priv *const priv)
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   368
{
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   369
	static const size_t overhead = CCAT_ETH_FRAME_HEAD_LEN - 4;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   370
	struct ccat_eth_dma_fifo *const fifo = &priv->rx_fifo;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   371
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   372
	/* TODO omit possible deadlock in situations with heavy traffic */
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   373
	while (ccat_eth_frame_received(fifo->next)) {
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   374
		const size_t len = le16_to_cpu(fifo->next->length) - overhead;
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   375
		if (priv->ecdev) {
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   376
			ecdev_receive(priv->ecdev, fifo->next->data, len);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   377
		} else {
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   378
			ccat_eth_receive(priv->netdev, fifo->next->data, len);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   379
		}
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   380
		ccat_eth_rx_fifo_add(fifo, fifo->next);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   381
		ccat_eth_fifo_inc(fifo);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   382
	}
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   383
}
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   384
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   385
static void ec_poll_rx(struct net_device *dev)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   386
{
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   387
	struct ccat_eth_priv *const priv = netdev_priv(dev);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   388
	poll_rx(priv);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   389
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   390
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   391
/**
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   392
 * Poll for available tx dma descriptors in ethernet operating mode
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   393
 */
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   394
static void poll_tx(struct ccat_eth_priv *const priv)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   395
{
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   396
	if (ccat_eth_frame_sent(priv->tx_fifo.next)) {
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   397
		netif_wake_queue(priv->netdev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   398
	}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   399
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   400
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   401
/**
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   402
 * Since CCAT doesn't support interrupts until now, we have to poll
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   403
 * some status bits to recognize things like link change etc.
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   404
 */
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   405
static enum hrtimer_restart poll_timer_callback(struct hrtimer *timer)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   406
{
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   407
	struct ccat_eth_priv *const priv =
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   408
	    container_of(timer, struct ccat_eth_priv, poll_timer);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   409
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   410
	poll_link(priv);
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   411
	if(!priv->ecdev) {
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   412
		poll_rx(priv);
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   413
		poll_tx(priv);
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   414
	}
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   415
	hrtimer_forward_now(timer, POLL_TIME);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   416
	return HRTIMER_RESTART;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   417
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   418
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   419
static struct rtnl_link_stats64 *ccat_eth_get_stats64(struct net_device *dev, struct rtnl_link_stats64
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   420
						      *storage)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   421
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   422
	struct ccat_eth_priv *const priv = netdev_priv(dev);
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   423
	struct ccat_mac_register mac;
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   424
	memcpy_fromio(&mac, priv->reg.mac, sizeof(mac));
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   425
	storage->rx_packets = mac.rx_frames;	/* total packets received       */
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   426
	storage->tx_packets = mac.tx_frames;	/* total packets transmitted    */
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   427
	storage->rx_bytes = atomic64_read(&priv->rx_bytes);	/* total bytes received         */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   428
	storage->tx_bytes = atomic64_read(&priv->tx_bytes);	/* total bytes transmitted      */
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   429
	storage->rx_errors = mac.frame_len_err + mac.rx_mem_full + mac.crc_err + mac.rx_err;	/* bad packets received         */
2573
ad9a35065387 remove print.* from release tree
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2572
diff changeset
   430
	storage->tx_errors = mac.tx_mem_full;	/* packet transmit problems     */
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   431
	storage->rx_dropped = atomic64_read(&priv->rx_dropped);	/* no space in linux buffers    */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   432
	storage->tx_dropped = atomic64_read(&priv->tx_dropped);	/* no space available in linux  */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   433
	//TODO __u64    multicast;              /* multicast packets received   */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   434
	//TODO __u64    collisions;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   435
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   436
	/* detailed rx_errors: */
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   437
	storage->rx_length_errors = mac.frame_len_err;
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   438
	storage->rx_over_errors = mac.rx_mem_full;	/* receiver ring buff overflow  */
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   439
	storage->rx_crc_errors = mac.crc_err;	/* recved pkt with crc error    */
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   440
	storage->rx_frame_errors = mac.rx_err;	/* recv'd frame alignment error */
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   441
	storage->rx_fifo_errors = mac.rx_mem_full;	/* recv'r fifo overrun          */
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   442
	//TODO __u64    rx_missed_errors;       /* receiver missed packet       */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   443
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   444
	/* detailed tx_errors */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   445
	//TODO __u64    tx_aborted_errors;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   446
	//TODO __u64    tx_carrier_errors;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   447
	//TODO __u64    tx_fifo_errors;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   448
	//TODO __u64    tx_heartbeat_errors;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   449
	//TODO __u64    tx_window_errors;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   450
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   451
	/* for cslip etc */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   452
	//TODO __u64    rx_compressed;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   453
	//TODO __u64    tx_compressed;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   454
	return storage;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   455
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   456
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   457
static int ccat_eth_open(struct net_device *dev)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   458
{
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   459
	struct ccat_eth_priv *const priv = netdev_priv(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   460
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   461
	hrtimer_init(&priv->poll_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   462
	priv->poll_timer.function = poll_timer_callback;
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   463
	hrtimer_start(&priv->poll_timer, POLL_TIME, HRTIMER_MODE_REL);
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   464
	return 0;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   465
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   466
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   467
static int ccat_eth_stop(struct net_device *dev)
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   468
{
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   469
	struct ccat_eth_priv *const priv = netdev_priv(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   470
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   471
	priv->stop_queue(dev);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   472
	hrtimer_cancel(&priv->poll_timer);
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   473
	return 0;
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   474
}
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   475
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   476
static const struct net_device_ops ccat_eth_netdev_ops = {
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   477
	.ndo_get_stats64 = ccat_eth_get_stats64,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   478
	.ndo_open = ccat_eth_open,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   479
	.ndo_start_xmit = ccat_eth_start_xmit,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   480
	.ndo_stop = ccat_eth_stop,
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   481
};
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   482
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   483
struct ccat_eth_priv *ccat_eth_init(const struct ccat_device *const ccatdev,
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   484
				    const void __iomem * const addr)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   485
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   486
	struct ccat_eth_priv *priv;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   487
	struct net_device *const netdev = alloc_etherdev(sizeof(*priv));
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   488
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   489
	priv = netdev_priv(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   490
	priv->netdev = netdev;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   491
	priv->ccatdev = ccatdev;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   492
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   493
	/* ccat register mappings */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   494
	memcpy_fromio(&priv->info, addr, sizeof(priv->info));
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   495
	ccat_eth_priv_init_mappings(priv);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   496
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   497
	if (ccat_eth_priv_init_dma(priv)) {
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   498
		pr_warn("%s(): DMA initialization failed.\n", __FUNCTION__);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   499
		free_netdev(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   500
		return NULL;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   501
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   502
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   503
	/* init netdev with MAC and stack callbacks */
2569
720172a7563f make ccat driver more linux compliant
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2568
diff changeset
   504
	memcpy_fromio(netdev->dev_addr, priv->reg.mii + 8, netdev->addr_len);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   505
	netdev->netdev_ops = &ccat_eth_netdev_ops;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   506
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   507
	/* use as EtherCAT device? */
2572
0bc1ec2711b1 reorder functions in netdev.c to avoid forward declarations
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2570
diff changeset
   508
	priv->ecdev = ecdev_offer(netdev, ec_poll_rx, THIS_MODULE);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   509
	if (priv->ecdev) {
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   510
		priv->carrier_off = ecdev_carrier_off;
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   511
		priv->carrier_ok = ecdev_carrier_ok;
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   512
		priv->carrier_on = ecdev_carrier_on;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   513
		priv->kfree_skb_any = ecdev_kfree_skb_any;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   514
		priv->start_queue = ecdev_nop;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   515
		priv->stop_queue = ecdev_nop;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   516
		priv->unregister = unregister_ecdev;
2568
2f3078ec9ffb move first *_carrier_off() in front of register_netdev()/ ecdev_open()
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2567
diff changeset
   517
2f3078ec9ffb move first *_carrier_off() in front of register_netdev()/ ecdev_open()
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2567
diff changeset
   518
		priv->carrier_off(netdev);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   519
		if (ecdev_open(priv->ecdev)) {
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   520
			pr_info("unable to register network device.\n");
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   521
			ecdev_withdraw(priv->ecdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   522
			ccat_eth_priv_free_dma(priv);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   523
			free_netdev(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   524
			return NULL;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   525
		}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   526
		return priv;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   527
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   528
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   529
	/* EtherCAT disabled -> prepare normal ethernet mode */
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   530
	priv->carrier_off = netif_carrier_off;
2567
d70aad2f131f - use short kernel types, add empty lines after variable declaration to conform better with linux coding style
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2565
diff changeset
   531
	priv->carrier_ok = netif_carrier_ok;
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   532
	priv->carrier_on = netif_carrier_on;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   533
	priv->kfree_skb_any = dev_kfree_skb_any;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   534
	priv->start_queue = netif_start_queue;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   535
	priv->stop_queue = netif_stop_queue;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   536
	priv->unregister = unregister_netdev;
2568
2f3078ec9ffb move first *_carrier_off() in front of register_netdev()/ ecdev_open()
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2567
diff changeset
   537
2f3078ec9ffb move first *_carrier_off() in front of register_netdev()/ ecdev_open()
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2567
diff changeset
   538
	priv->carrier_off(netdev);
2550
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   539
	if (register_netdev(netdev)) {
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   540
		pr_info("unable to register network device.\n");
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   541
		ccat_eth_priv_free_dma(priv);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   542
		free_netdev(netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   543
		return NULL;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   544
	}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   545
	pr_info("registered %s as network device.\n", netdev->name);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   546
	return priv;
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   547
}
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   548
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   549
void ccat_eth_remove(struct ccat_eth_priv *const priv)
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   550
{
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   551
	priv->unregister(priv->netdev);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   552
	ccat_eth_priv_free_dma(priv);
7e25950ea941 replace not working symlinks with real copies from the ccat main repository(git)
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2549
diff changeset
   553
	free_netdev(priv->netdev);
2576
f6a5b3bb0594 Refactoring:
Patrick Bruenn <p.bruenn@beckhoff.com>
parents: 2574
diff changeset
   554
}