3340 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Driver for Marvell Discovery (MV643XX) and Marvell Orion ethernet ports4 * Copyright (C) 2002 Matthew Dharm <mdharm@momenco.com>5 *6 * Based on the 64360 driver from:7 * Copyright (C) 2002 Rabeeh Khoury <rabeeh@galileo.co.il>8 * Rabeeh Khoury <rabeeh@marvell.com>9 *10 * Copyright (C) 2003 PMC-Sierra, Inc.,11 * written by Manish Lachwani12 *13 * Copyright (C) 2003 Ralf Baechle <ralf@linux-mips.org>14 *15 * Copyright (C) 2004-2006 MontaVista Software, Inc.16 * Dale Farnsworth <dale@farnsworth.org>17 *18 * Copyright (C) 2004 Steven J. Hill <sjhill1@rockwellcollins.com>19 * <sjhill@realitydiluted.com>20 *21 * Copyright (C) 2007-2008 Marvell Semiconductor22 * Lennert Buytenhek <buytenh@marvell.com>23 *24 * Copyright (C) 2013 Michael Stapelberg <michael@stapelberg.de>25 */26 27#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt28 29#include <linux/init.h>30#include <linux/dma-mapping.h>31#include <linux/in.h>32#include <linux/ip.h>33#include <net/tso.h>34#include <linux/tcp.h>35#include <linux/udp.h>36#include <linux/etherdevice.h>37#include <linux/delay.h>38#include <linux/ethtool.h>39#include <linux/platform_device.h>40#include <linux/module.h>41#include <linux/kernel.h>42#include <linux/spinlock.h>43#include <linux/workqueue.h>44#include <linux/phy.h>45#include <linux/mv643xx_eth.h>46#include <linux/io.h>47#include <linux/interrupt.h>48#include <linux/types.h>49#include <linux/slab.h>50#include <linux/clk.h>51#include <linux/of.h>52#include <linux/of_irq.h>53#include <linux/of_net.h>54#include <linux/of_mdio.h>55 56static char mv643xx_eth_driver_name[] = "mv643xx_eth";57static char mv643xx_eth_driver_version[] = "1.4";58 59 60/*61 * Registers shared between all ports.62 */63#define PHY_ADDR 0x000064#define WINDOW_BASE(w) (0x0200 + ((w) << 3))65#define WINDOW_SIZE(w) (0x0204 + ((w) << 3))66#define WINDOW_REMAP_HIGH(w) (0x0280 + ((w) << 2))67#define WINDOW_BAR_ENABLE 0x029068#define WINDOW_PROTECT(w) (0x0294 + ((w) << 4))69 70/*71 * Main per-port registers. These live at offset 0x0400 for72 * port #0, 0x0800 for port #1, and 0x0c00 for port #2.73 */74#define PORT_CONFIG 0x000075#define UNICAST_PROMISCUOUS_MODE 0x0000000176#define PORT_CONFIG_EXT 0x000477#define MAC_ADDR_LOW 0x001478#define MAC_ADDR_HIGH 0x001879#define SDMA_CONFIG 0x001c80#define TX_BURST_SIZE_16_64BIT 0x0100000081#define TX_BURST_SIZE_4_64BIT 0x0080000082#define BLM_TX_NO_SWAP 0x0000002083#define BLM_RX_NO_SWAP 0x0000001084#define RX_BURST_SIZE_16_64BIT 0x0000000885#define RX_BURST_SIZE_4_64BIT 0x0000000486#define PORT_SERIAL_CONTROL 0x003c87#define SET_MII_SPEED_TO_100 0x0100000088#define SET_GMII_SPEED_TO_1000 0x0080000089#define SET_FULL_DUPLEX_MODE 0x0020000090#define MAX_RX_PACKET_9700BYTE 0x000a000091#define DISABLE_AUTO_NEG_SPEED_GMII 0x0000200092#define DO_NOT_FORCE_LINK_FAIL 0x0000040093#define SERIAL_PORT_CONTROL_RESERVED 0x0000020094#define DISABLE_AUTO_NEG_FOR_FLOW_CTRL 0x0000000895#define DISABLE_AUTO_NEG_FOR_DUPLEX 0x0000000496#define FORCE_LINK_PASS 0x0000000297#define SERIAL_PORT_ENABLE 0x0000000198#define PORT_STATUS 0x004499#define TX_FIFO_EMPTY 0x00000400100#define TX_IN_PROGRESS 0x00000080101#define PORT_SPEED_MASK 0x00000030102#define PORT_SPEED_1000 0x00000010103#define PORT_SPEED_100 0x00000020104#define PORT_SPEED_10 0x00000000105#define FLOW_CONTROL_ENABLED 0x00000008106#define FULL_DUPLEX 0x00000004107#define LINK_UP 0x00000002108#define TXQ_COMMAND 0x0048109#define TXQ_FIX_PRIO_CONF 0x004c110#define PORT_SERIAL_CONTROL1 0x004c111#define RGMII_EN 0x00000008112#define CLK125_BYPASS_EN 0x00000010113#define TX_BW_RATE 0x0050114#define TX_BW_MTU 0x0058115#define TX_BW_BURST 0x005c116#define INT_CAUSE 0x0060117#define INT_TX_END 0x07f80000118#define INT_TX_END_0 0x00080000119#define INT_RX 0x000003fc120#define INT_RX_0 0x00000004121#define INT_EXT 0x00000002122#define INT_CAUSE_EXT 0x0064123#define INT_EXT_LINK_PHY 0x00110000124#define INT_EXT_TX 0x000000ff125#define INT_MASK 0x0068126#define INT_MASK_EXT 0x006c127#define TX_FIFO_URGENT_THRESHOLD 0x0074128#define RX_DISCARD_FRAME_CNT 0x0084129#define RX_OVERRUN_FRAME_CNT 0x0088130#define TXQ_FIX_PRIO_CONF_MOVED 0x00dc131#define TX_BW_RATE_MOVED 0x00e0132#define TX_BW_MTU_MOVED 0x00e8133#define TX_BW_BURST_MOVED 0x00ec134#define RXQ_CURRENT_DESC_PTR(q) (0x020c + ((q) << 4))135#define RXQ_COMMAND 0x0280136#define TXQ_CURRENT_DESC_PTR(q) (0x02c0 + ((q) << 2))137#define TXQ_BW_TOKENS(q) (0x0300 + ((q) << 4))138#define TXQ_BW_CONF(q) (0x0304 + ((q) << 4))139#define TXQ_BW_WRR_CONF(q) (0x0308 + ((q) << 4))140 141/*142 * Misc per-port registers.143 */144#define MIB_COUNTERS(p) (0x1000 + ((p) << 7))145#define SPECIAL_MCAST_TABLE(p) (0x1400 + ((p) << 10))146#define OTHER_MCAST_TABLE(p) (0x1500 + ((p) << 10))147#define UNICAST_TABLE(p) (0x1600 + ((p) << 10))148 149 150/*151 * SDMA configuration register default value.152 */153#if defined(__BIG_ENDIAN)154#define PORT_SDMA_CONFIG_DEFAULT_VALUE \155 (RX_BURST_SIZE_4_64BIT | \156 TX_BURST_SIZE_4_64BIT)157#elif defined(__LITTLE_ENDIAN)158#define PORT_SDMA_CONFIG_DEFAULT_VALUE \159 (RX_BURST_SIZE_4_64BIT | \160 BLM_RX_NO_SWAP | \161 BLM_TX_NO_SWAP | \162 TX_BURST_SIZE_4_64BIT)163#else164#error One of __BIG_ENDIAN or __LITTLE_ENDIAN must be defined165#endif166 167 168/*169 * Misc definitions.170 */171#define DEFAULT_RX_QUEUE_SIZE 128172#define DEFAULT_TX_QUEUE_SIZE 512173#define SKB_DMA_REALIGN ((PAGE_SIZE - NET_SKB_PAD) % SMP_CACHE_BYTES)174 175/* Max number of allowed TCP segments for software TSO */176#define MV643XX_MAX_TSO_SEGS 100177#define MV643XX_MAX_SKB_DESCS (MV643XX_MAX_TSO_SEGS * 2 + MAX_SKB_FRAGS)178 179#define IS_TSO_HEADER(txq, addr) \180 ((addr >= txq->tso_hdrs_dma) && \181 (addr < txq->tso_hdrs_dma + txq->tx_ring_size * TSO_HEADER_SIZE))182 183#define DESC_DMA_MAP_SINGLE 0184#define DESC_DMA_MAP_PAGE 1185 186/*187 * RX/TX descriptors.188 */189#if defined(__BIG_ENDIAN)190struct rx_desc {191 u16 byte_cnt; /* Descriptor buffer byte count */192 u16 buf_size; /* Buffer size */193 u32 cmd_sts; /* Descriptor command status */194 u32 next_desc_ptr; /* Next descriptor pointer */195 u32 buf_ptr; /* Descriptor buffer pointer */196};197 198struct tx_desc {199 u16 byte_cnt; /* buffer byte count */200 u16 l4i_chk; /* CPU provided TCP checksum */201 u32 cmd_sts; /* Command/status field */202 u32 next_desc_ptr; /* Pointer to next descriptor */203 u32 buf_ptr; /* pointer to buffer for this descriptor*/204};205#elif defined(__LITTLE_ENDIAN)206struct rx_desc {207 u32 cmd_sts; /* Descriptor command status */208 u16 buf_size; /* Buffer size */209 u16 byte_cnt; /* Descriptor buffer byte count */210 u32 buf_ptr; /* Descriptor buffer pointer */211 u32 next_desc_ptr; /* Next descriptor pointer */212};213 214struct tx_desc {215 u32 cmd_sts; /* Command/status field */216 u16 l4i_chk; /* CPU provided TCP checksum */217 u16 byte_cnt; /* buffer byte count */218 u32 buf_ptr; /* pointer to buffer for this descriptor*/219 u32 next_desc_ptr; /* Pointer to next descriptor */220};221#else222#error One of __BIG_ENDIAN or __LITTLE_ENDIAN must be defined223#endif224 225/* RX & TX descriptor command */226#define BUFFER_OWNED_BY_DMA 0x80000000227 228/* RX & TX descriptor status */229#define ERROR_SUMMARY 0x00000001230 231/* RX descriptor status */232#define LAYER_4_CHECKSUM_OK 0x40000000233#define RX_ENABLE_INTERRUPT 0x20000000234#define RX_FIRST_DESC 0x08000000235#define RX_LAST_DESC 0x04000000236#define RX_IP_HDR_OK 0x02000000237#define RX_PKT_IS_IPV4 0x01000000238#define RX_PKT_IS_ETHERNETV2 0x00800000239#define RX_PKT_LAYER4_TYPE_MASK 0x00600000240#define RX_PKT_LAYER4_TYPE_TCP_IPV4 0x00000000241#define RX_PKT_IS_VLAN_TAGGED 0x00080000242 243/* TX descriptor command */244#define TX_ENABLE_INTERRUPT 0x00800000245#define GEN_CRC 0x00400000246#define TX_FIRST_DESC 0x00200000247#define TX_LAST_DESC 0x00100000248#define ZERO_PADDING 0x00080000249#define GEN_IP_V4_CHECKSUM 0x00040000250#define GEN_TCP_UDP_CHECKSUM 0x00020000251#define UDP_FRAME 0x00010000252#define MAC_HDR_EXTRA_4_BYTES 0x00008000253#define GEN_TCP_UDP_CHK_FULL 0x00000400254#define MAC_HDR_EXTRA_8_BYTES 0x00000200255 256#define TX_IHL_SHIFT 11257 258 259/* global *******************************************************************/260struct mv643xx_eth_shared_private {261 /*262 * Ethernet controller base address.263 */264 void __iomem *base;265 266 /*267 * Per-port MBUS window access register value.268 */269 u32 win_protect;270 271 /*272 * Hardware-specific parameters.273 */274 int extended_rx_coal_limit;275 int tx_bw_control;276 int tx_csum_limit;277 struct clk *clk;278};279 280#define TX_BW_CONTROL_ABSENT 0281#define TX_BW_CONTROL_OLD_LAYOUT 1282#define TX_BW_CONTROL_NEW_LAYOUT 2283 284static int mv643xx_eth_open(struct net_device *dev);285static int mv643xx_eth_stop(struct net_device *dev);286 287 288/* per-port *****************************************************************/289struct mib_counters {290 u64 good_octets_received;291 u32 bad_octets_received;292 u32 internal_mac_transmit_err;293 u32 good_frames_received;294 u32 bad_frames_received;295 u32 broadcast_frames_received;296 u32 multicast_frames_received;297 u32 frames_64_octets;298 u32 frames_65_to_127_octets;299 u32 frames_128_to_255_octets;300 u32 frames_256_to_511_octets;301 u32 frames_512_to_1023_octets;302 u32 frames_1024_to_max_octets;303 u64 good_octets_sent;304 u32 good_frames_sent;305 u32 excessive_collision;306 u32 multicast_frames_sent;307 u32 broadcast_frames_sent;308 u32 unrec_mac_control_received;309 u32 fc_sent;310 u32 good_fc_received;311 u32 bad_fc_received;312 u32 undersize_received;313 u32 fragments_received;314 u32 oversize_received;315 u32 jabber_received;316 u32 mac_receive_error;317 u32 bad_crc_event;318 u32 collision;319 u32 late_collision;320 /* Non MIB hardware counters */321 u32 rx_discard;322 u32 rx_overrun;323};324 325struct rx_queue {326 int index;327 328 int rx_ring_size;329 330 int rx_desc_count;331 int rx_curr_desc;332 int rx_used_desc;333 334 struct rx_desc *rx_desc_area;335 dma_addr_t rx_desc_dma;336 int rx_desc_area_size;337 struct sk_buff **rx_skb;338};339 340struct tx_queue {341 int index;342 343 int tx_ring_size;344 345 int tx_desc_count;346 int tx_curr_desc;347 int tx_used_desc;348 349 int tx_stop_threshold;350 int tx_wake_threshold;351 352 char *tso_hdrs;353 dma_addr_t tso_hdrs_dma;354 355 struct tx_desc *tx_desc_area;356 char *tx_desc_mapping; /* array to track the type of the dma mapping */357 dma_addr_t tx_desc_dma;358 int tx_desc_area_size;359 360 struct sk_buff_head tx_skb;361 362 unsigned long tx_packets;363 unsigned long tx_bytes;364 unsigned long tx_dropped;365};366 367struct mv643xx_eth_private {368 struct mv643xx_eth_shared_private *shared;369 void __iomem *base;370 int port_num;371 372 struct net_device *dev;373 374 struct timer_list mib_counters_timer;375 spinlock_t mib_counters_lock;376 struct mib_counters mib_counters;377 378 struct work_struct tx_timeout_task;379 380 struct napi_struct napi;381 u32 int_mask;382 u8 oom;383 u8 work_link;384 u8 work_tx;385 u8 work_tx_end;386 u8 work_rx;387 u8 work_rx_refill;388 389 int skb_size;390 391 /*392 * RX state.393 */394 int rx_ring_size;395 unsigned long rx_desc_sram_addr;396 int rx_desc_sram_size;397 int rxq_count;398 struct timer_list rx_oom;399 struct rx_queue rxq[8];400 401 /*402 * TX state.403 */404 int tx_ring_size;405 unsigned long tx_desc_sram_addr;406 int tx_desc_sram_size;407 int txq_count;408 struct tx_queue txq[8];409 410 /*411 * Hardware-specific parameters.412 */413 struct clk *clk;414 unsigned int t_clk;415};416 417 418/* port register accessors **************************************************/419static inline u32 rdl(struct mv643xx_eth_private *mp, int offset)420{421 return readl(mp->shared->base + offset);422}423 424static inline u32 rdlp(struct mv643xx_eth_private *mp, int offset)425{426 return readl(mp->base + offset);427}428 429static inline void wrl(struct mv643xx_eth_private *mp, int offset, u32 data)430{431 writel(data, mp->shared->base + offset);432}433 434static inline void wrlp(struct mv643xx_eth_private *mp, int offset, u32 data)435{436 writel(data, mp->base + offset);437}438 439 440/* rxq/txq helper functions *************************************************/441static struct mv643xx_eth_private *rxq_to_mp(struct rx_queue *rxq)442{443 return container_of(rxq, struct mv643xx_eth_private, rxq[rxq->index]);444}445 446static struct mv643xx_eth_private *txq_to_mp(struct tx_queue *txq)447{448 return container_of(txq, struct mv643xx_eth_private, txq[txq->index]);449}450 451static void rxq_enable(struct rx_queue *rxq)452{453 struct mv643xx_eth_private *mp = rxq_to_mp(rxq);454 wrlp(mp, RXQ_COMMAND, 1 << rxq->index);455}456 457static void rxq_disable(struct rx_queue *rxq)458{459 struct mv643xx_eth_private *mp = rxq_to_mp(rxq);460 u8 mask = 1 << rxq->index;461 462 wrlp(mp, RXQ_COMMAND, mask << 8);463 while (rdlp(mp, RXQ_COMMAND) & mask)464 udelay(10);465}466 467static void txq_reset_hw_ptr(struct tx_queue *txq)468{469 struct mv643xx_eth_private *mp = txq_to_mp(txq);470 u32 addr;471 472 addr = (u32)txq->tx_desc_dma;473 addr += txq->tx_curr_desc * sizeof(struct tx_desc);474 wrlp(mp, TXQ_CURRENT_DESC_PTR(txq->index), addr);475}476 477static void txq_enable(struct tx_queue *txq)478{479 struct mv643xx_eth_private *mp = txq_to_mp(txq);480 wrlp(mp, TXQ_COMMAND, 1 << txq->index);481}482 483static void txq_disable(struct tx_queue *txq)484{485 struct mv643xx_eth_private *mp = txq_to_mp(txq);486 u8 mask = 1 << txq->index;487 488 wrlp(mp, TXQ_COMMAND, mask << 8);489 while (rdlp(mp, TXQ_COMMAND) & mask)490 udelay(10);491}492 493static void txq_maybe_wake(struct tx_queue *txq)494{495 struct mv643xx_eth_private *mp = txq_to_mp(txq);496 struct netdev_queue *nq = netdev_get_tx_queue(mp->dev, txq->index);497 498 if (netif_tx_queue_stopped(nq)) {499 __netif_tx_lock(nq, smp_processor_id());500 if (txq->tx_desc_count <= txq->tx_wake_threshold)501 netif_tx_wake_queue(nq);502 __netif_tx_unlock(nq);503 }504}505 506static int rxq_process(struct rx_queue *rxq, int budget)507{508 struct mv643xx_eth_private *mp = rxq_to_mp(rxq);509 struct net_device_stats *stats = &mp->dev->stats;510 int rx;511 512 rx = 0;513 while (rx < budget && rxq->rx_desc_count) {514 struct rx_desc *rx_desc;515 unsigned int cmd_sts;516 struct sk_buff *skb;517 u16 byte_cnt;518 519 rx_desc = &rxq->rx_desc_area[rxq->rx_curr_desc];520 521 cmd_sts = rx_desc->cmd_sts;522 if (cmd_sts & BUFFER_OWNED_BY_DMA)523 break;524 rmb();525 526 skb = rxq->rx_skb[rxq->rx_curr_desc];527 rxq->rx_skb[rxq->rx_curr_desc] = NULL;528 529 rxq->rx_curr_desc++;530 if (rxq->rx_curr_desc == rxq->rx_ring_size)531 rxq->rx_curr_desc = 0;532 533 dma_unmap_single(mp->dev->dev.parent, rx_desc->buf_ptr,534 rx_desc->buf_size, DMA_FROM_DEVICE);535 rxq->rx_desc_count--;536 rx++;537 538 mp->work_rx_refill |= 1 << rxq->index;539 540 byte_cnt = rx_desc->byte_cnt;541 542 /*543 * Update statistics.544 *545 * Note that the descriptor byte count includes 2 dummy546 * bytes automatically inserted by the hardware at the547 * start of the packet (which we don't count), and a 4548 * byte CRC at the end of the packet (which we do count).549 */550 stats->rx_packets++;551 stats->rx_bytes += byte_cnt - 2;552 553 /*554 * In case we received a packet without first / last bits555 * on, or the error summary bit is set, the packet needs556 * to be dropped.557 */558 if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC | ERROR_SUMMARY))559 != (RX_FIRST_DESC | RX_LAST_DESC))560 goto err;561 562 /*563 * The -4 is for the CRC in the trailer of the564 * received packet565 */566 skb_put(skb, byte_cnt - 2 - 4);567 568 if (cmd_sts & LAYER_4_CHECKSUM_OK)569 skb->ip_summed = CHECKSUM_UNNECESSARY;570 skb->protocol = eth_type_trans(skb, mp->dev);571 572 napi_gro_receive(&mp->napi, skb);573 574 continue;575 576err:577 stats->rx_dropped++;578 579 if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=580 (RX_FIRST_DESC | RX_LAST_DESC)) {581 if (net_ratelimit())582 netdev_err(mp->dev,583 "received packet spanning multiple descriptors\n");584 }585 586 if (cmd_sts & ERROR_SUMMARY)587 stats->rx_errors++;588 589 dev_kfree_skb(skb);590 }591 592 if (rx < budget)593 mp->work_rx &= ~(1 << rxq->index);594 595 return rx;596}597 598static int rxq_refill(struct rx_queue *rxq, int budget)599{600 struct mv643xx_eth_private *mp = rxq_to_mp(rxq);601 int refilled;602 603 refilled = 0;604 while (refilled < budget && rxq->rx_desc_count < rxq->rx_ring_size) {605 struct sk_buff *skb;606 int rx;607 struct rx_desc *rx_desc;608 int size;609 610 skb = netdev_alloc_skb(mp->dev, mp->skb_size);611 612 if (skb == NULL) {613 mp->oom = 1;614 goto oom;615 }616 617 if (SKB_DMA_REALIGN)618 skb_reserve(skb, SKB_DMA_REALIGN);619 620 refilled++;621 rxq->rx_desc_count++;622 623 rx = rxq->rx_used_desc++;624 if (rxq->rx_used_desc == rxq->rx_ring_size)625 rxq->rx_used_desc = 0;626 627 rx_desc = rxq->rx_desc_area + rx;628 629 size = skb_end_pointer(skb) - skb->data;630 rx_desc->buf_ptr = dma_map_single(mp->dev->dev.parent,631 skb->data, size,632 DMA_FROM_DEVICE);633 rx_desc->buf_size = size;634 rxq->rx_skb[rx] = skb;635 wmb();636 rx_desc->cmd_sts = BUFFER_OWNED_BY_DMA | RX_ENABLE_INTERRUPT;637 wmb();638 639 /*640 * The hardware automatically prepends 2 bytes of641 * dummy data to each received packet, so that the642 * IP header ends up 16-byte aligned.643 */644 skb_reserve(skb, 2);645 }646 647 if (refilled < budget)648 mp->work_rx_refill &= ~(1 << rxq->index);649 650oom:651 return refilled;652}653 654 655/* tx ***********************************************************************/656static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb)657{658 int frag;659 660 for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {661 const skb_frag_t *fragp = &skb_shinfo(skb)->frags[frag];662 663 if (skb_frag_size(fragp) <= 8 && skb_frag_off(fragp) & 7)664 return 1;665 }666 667 return 0;668}669 670static int skb_tx_csum(struct mv643xx_eth_private *mp, struct sk_buff *skb,671 u16 *l4i_chk, u32 *command, int length)672{673 int ret;674 u32 cmd = 0;675 676 if (skb->ip_summed == CHECKSUM_PARTIAL) {677 int hdr_len;678 int tag_bytes;679 680 BUG_ON(skb->protocol != htons(ETH_P_IP) &&681 skb->protocol != htons(ETH_P_8021Q));682 683 hdr_len = (void *)ip_hdr(skb) - (void *)skb->data;684 tag_bytes = hdr_len - ETH_HLEN;685 686 if (length - hdr_len > mp->shared->tx_csum_limit ||687 unlikely(tag_bytes & ~12)) {688 ret = skb_checksum_help(skb);689 if (!ret)690 goto no_csum;691 return ret;692 }693 694 if (tag_bytes & 4)695 cmd |= MAC_HDR_EXTRA_4_BYTES;696 if (tag_bytes & 8)697 cmd |= MAC_HDR_EXTRA_8_BYTES;698 699 cmd |= GEN_TCP_UDP_CHECKSUM | GEN_TCP_UDP_CHK_FULL |700 GEN_IP_V4_CHECKSUM |701 ip_hdr(skb)->ihl << TX_IHL_SHIFT;702 703 /* TODO: Revisit this. With the usage of GEN_TCP_UDP_CHK_FULL704 * it seems we don't need to pass the initial checksum.705 */706 switch (ip_hdr(skb)->protocol) {707 case IPPROTO_UDP:708 cmd |= UDP_FRAME;709 *l4i_chk = 0;710 break;711 case IPPROTO_TCP:712 *l4i_chk = 0;713 break;714 default:715 WARN(1, "protocol not supported");716 }717 } else {718no_csum:719 /* Errata BTS #50, IHL must be 5 if no HW checksum */720 cmd |= 5 << TX_IHL_SHIFT;721 }722 *command = cmd;723 return 0;724}725 726static inline int727txq_put_data_tso(struct net_device *dev, struct tx_queue *txq,728 struct sk_buff *skb, char *data, int length,729 bool last_tcp, bool is_last)730{731 int tx_index;732 u32 cmd_sts;733 struct tx_desc *desc;734 735 tx_index = txq->tx_curr_desc++;736 if (txq->tx_curr_desc == txq->tx_ring_size)737 txq->tx_curr_desc = 0;738 desc = &txq->tx_desc_area[tx_index];739 txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_SINGLE;740 741 desc->l4i_chk = 0;742 desc->byte_cnt = length;743 744 if (length <= 8 && (uintptr_t)data & 0x7) {745 /* Copy unaligned small data fragment to TSO header data area */746 memcpy(txq->tso_hdrs + tx_index * TSO_HEADER_SIZE,747 data, length);748 desc->buf_ptr = txq->tso_hdrs_dma749 + tx_index * TSO_HEADER_SIZE;750 } else {751 /* Alignment is okay, map buffer and hand off to hardware */752 txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_SINGLE;753 desc->buf_ptr = dma_map_single(dev->dev.parent, data,754 length, DMA_TO_DEVICE);755 if (unlikely(dma_mapping_error(dev->dev.parent,756 desc->buf_ptr))) {757 WARN(1, "dma_map_single failed!\n");758 return -ENOMEM;759 }760 }761 762 cmd_sts = BUFFER_OWNED_BY_DMA;763 if (last_tcp) {764 /* last descriptor in the TCP packet */765 cmd_sts |= ZERO_PADDING | TX_LAST_DESC;766 /* last descriptor in SKB */767 if (is_last)768 cmd_sts |= TX_ENABLE_INTERRUPT;769 }770 desc->cmd_sts = cmd_sts;771 return 0;772}773 774static inline void775txq_put_hdr_tso(struct sk_buff *skb, struct tx_queue *txq, int length,776 u32 *first_cmd_sts, bool first_desc)777{778 struct mv643xx_eth_private *mp = txq_to_mp(txq);779 int hdr_len = skb_tcp_all_headers(skb);780 int tx_index;781 struct tx_desc *desc;782 int ret;783 u32 cmd_csum = 0;784 u16 l4i_chk = 0;785 u32 cmd_sts;786 787 tx_index = txq->tx_curr_desc;788 desc = &txq->tx_desc_area[tx_index];789 790 ret = skb_tx_csum(mp, skb, &l4i_chk, &cmd_csum, length);791 if (ret)792 WARN(1, "failed to prepare checksum!");793 794 /* Should we set this? Can't use the value from skb_tx_csum()795 * as it's not the correct initial L4 checksum to use.796 */797 desc->l4i_chk = 0;798 799 desc->byte_cnt = hdr_len;800 desc->buf_ptr = txq->tso_hdrs_dma +801 txq->tx_curr_desc * TSO_HEADER_SIZE;802 cmd_sts = cmd_csum | BUFFER_OWNED_BY_DMA | TX_FIRST_DESC |803 GEN_CRC;804 805 /* Defer updating the first command descriptor until all806 * following descriptors have been written.807 */808 if (first_desc)809 *first_cmd_sts = cmd_sts;810 else811 desc->cmd_sts = cmd_sts;812 813 txq->tx_curr_desc++;814 if (txq->tx_curr_desc == txq->tx_ring_size)815 txq->tx_curr_desc = 0;816}817 818static int txq_submit_tso(struct tx_queue *txq, struct sk_buff *skb,819 struct net_device *dev)820{821 struct mv643xx_eth_private *mp = txq_to_mp(txq);822 int hdr_len, total_len, data_left, ret;823 int desc_count = 0;824 struct tso_t tso;825 struct tx_desc *first_tx_desc;826 u32 first_cmd_sts = 0;827 828 /* Count needed descriptors */829 if ((txq->tx_desc_count + tso_count_descs(skb)) >= txq->tx_ring_size) {830 netdev_dbg(dev, "not enough descriptors for TSO!\n");831 return -EBUSY;832 }833 834 first_tx_desc = &txq->tx_desc_area[txq->tx_curr_desc];835 836 /* Initialize the TSO handler, and prepare the first payload */837 hdr_len = tso_start(skb, &tso);838 839 total_len = skb->len - hdr_len;840 while (total_len > 0) {841 bool first_desc = (desc_count == 0);842 char *hdr;843 844 data_left = min_t(int, skb_shinfo(skb)->gso_size, total_len);845 total_len -= data_left;846 desc_count++;847 848 /* prepare packet headers: MAC + IP + TCP */849 hdr = txq->tso_hdrs + txq->tx_curr_desc * TSO_HEADER_SIZE;850 tso_build_hdr(skb, hdr, &tso, data_left, total_len == 0);851 txq_put_hdr_tso(skb, txq, data_left, &first_cmd_sts,852 first_desc);853 854 while (data_left > 0) {855 int size;856 desc_count++;857 858 size = min_t(int, tso.size, data_left);859 ret = txq_put_data_tso(dev, txq, skb, tso.data, size,860 size == data_left,861 total_len == 0);862 if (ret)863 goto err_release;864 data_left -= size;865 tso_build_data(skb, &tso, size);866 }867 }868 869 __skb_queue_tail(&txq->tx_skb, skb);870 skb_tx_timestamp(skb);871 872 /* ensure all other descriptors are written before first cmd_sts */873 wmb();874 first_tx_desc->cmd_sts = first_cmd_sts;875 876 /* clear TX_END status */877 mp->work_tx_end &= ~(1 << txq->index);878 879 /* ensure all descriptors are written before poking hardware */880 wmb();881 txq_enable(txq);882 txq->tx_desc_count += desc_count;883 return 0;884err_release:885 /* TODO: Release all used data descriptors; header descriptors must not886 * be DMA-unmapped.887 */888 return ret;889}890 891static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb)892{893 struct mv643xx_eth_private *mp = txq_to_mp(txq);894 int nr_frags = skb_shinfo(skb)->nr_frags;895 int frag;896 897 for (frag = 0; frag < nr_frags; frag++) {898 skb_frag_t *this_frag;899 int tx_index;900 struct tx_desc *desc;901 902 this_frag = &skb_shinfo(skb)->frags[frag];903 tx_index = txq->tx_curr_desc++;904 if (txq->tx_curr_desc == txq->tx_ring_size)905 txq->tx_curr_desc = 0;906 desc = &txq->tx_desc_area[tx_index];907 txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_PAGE;908 909 /*910 * The last fragment will generate an interrupt911 * which will free the skb on TX completion.912 */913 if (frag == nr_frags - 1) {914 desc->cmd_sts = BUFFER_OWNED_BY_DMA |915 ZERO_PADDING | TX_LAST_DESC |916 TX_ENABLE_INTERRUPT;917 } else {918 desc->cmd_sts = BUFFER_OWNED_BY_DMA;919 }920 921 desc->l4i_chk = 0;922 desc->byte_cnt = skb_frag_size(this_frag);923 desc->buf_ptr = skb_frag_dma_map(mp->dev->dev.parent,924 this_frag, 0, desc->byte_cnt,925 DMA_TO_DEVICE);926 }927}928 929static int txq_submit_skb(struct tx_queue *txq, struct sk_buff *skb,930 struct net_device *dev)931{932 struct mv643xx_eth_private *mp = txq_to_mp(txq);933 int nr_frags = skb_shinfo(skb)->nr_frags;934 int tx_index;935 struct tx_desc *desc;936 u32 cmd_sts;937 u16 l4i_chk;938 int length, ret;939 940 cmd_sts = 0;941 l4i_chk = 0;942 943 if (txq->tx_ring_size - txq->tx_desc_count < MAX_SKB_FRAGS + 1) {944 if (net_ratelimit())945 netdev_err(dev, "tx queue full?!\n");946 return -EBUSY;947 }948 949 ret = skb_tx_csum(mp, skb, &l4i_chk, &cmd_sts, skb->len);950 if (ret)951 return ret;952 cmd_sts |= TX_FIRST_DESC | GEN_CRC | BUFFER_OWNED_BY_DMA;953 954 tx_index = txq->tx_curr_desc++;955 if (txq->tx_curr_desc == txq->tx_ring_size)956 txq->tx_curr_desc = 0;957 desc = &txq->tx_desc_area[tx_index];958 txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_SINGLE;959 960 if (nr_frags) {961 txq_submit_frag_skb(txq, skb);962 length = skb_headlen(skb);963 } else {964 cmd_sts |= ZERO_PADDING | TX_LAST_DESC | TX_ENABLE_INTERRUPT;965 length = skb->len;966 }967 968 desc->l4i_chk = l4i_chk;969 desc->byte_cnt = length;970 desc->buf_ptr = dma_map_single(mp->dev->dev.parent, skb->data,971 length, DMA_TO_DEVICE);972 973 __skb_queue_tail(&txq->tx_skb, skb);974 975 skb_tx_timestamp(skb);976 977 /* ensure all other descriptors are written before first cmd_sts */978 wmb();979 desc->cmd_sts = cmd_sts;980 981 /* clear TX_END status */982 mp->work_tx_end &= ~(1 << txq->index);983 984 /* ensure all descriptors are written before poking hardware */985 wmb();986 txq_enable(txq);987 988 txq->tx_desc_count += nr_frags + 1;989 990 return 0;991}992 993static netdev_tx_t mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev)994{995 struct mv643xx_eth_private *mp = netdev_priv(dev);996 int length, queue, ret;997 struct tx_queue *txq;998 struct netdev_queue *nq;999 1000 queue = skb_get_queue_mapping(skb);1001 txq = mp->txq + queue;1002 nq = netdev_get_tx_queue(dev, queue);1003 1004 if (has_tiny_unaligned_frags(skb) && __skb_linearize(skb)) {1005 netdev_printk(KERN_DEBUG, dev,1006 "failed to linearize skb with tiny unaligned fragment\n");1007 return NETDEV_TX_BUSY;1008 }1009 1010 length = skb->len;1011 1012 if (skb_is_gso(skb))1013 ret = txq_submit_tso(txq, skb, dev);1014 else1015 ret = txq_submit_skb(txq, skb, dev);1016 if (!ret) {1017 txq->tx_bytes += length;1018 txq->tx_packets++;1019 1020 if (txq->tx_desc_count >= txq->tx_stop_threshold)1021 netif_tx_stop_queue(nq);1022 } else {1023 txq->tx_dropped++;1024 dev_kfree_skb_any(skb);1025 }1026 1027 return NETDEV_TX_OK;1028}1029 1030 1031/* tx napi ******************************************************************/1032static void txq_kick(struct tx_queue *txq)1033{1034 struct mv643xx_eth_private *mp = txq_to_mp(txq);1035 struct netdev_queue *nq = netdev_get_tx_queue(mp->dev, txq->index);1036 u32 hw_desc_ptr;1037 u32 expected_ptr;1038 1039 __netif_tx_lock(nq, smp_processor_id());1040 1041 if (rdlp(mp, TXQ_COMMAND) & (1 << txq->index))1042 goto out;1043 1044 hw_desc_ptr = rdlp(mp, TXQ_CURRENT_DESC_PTR(txq->index));1045 expected_ptr = (u32)txq->tx_desc_dma +1046 txq->tx_curr_desc * sizeof(struct tx_desc);1047 1048 if (hw_desc_ptr != expected_ptr)1049 txq_enable(txq);1050 1051out:1052 __netif_tx_unlock(nq);1053 1054 mp->work_tx_end &= ~(1 << txq->index);1055}1056 1057static int txq_reclaim(struct tx_queue *txq, int budget, int force)1058{1059 struct mv643xx_eth_private *mp = txq_to_mp(txq);1060 struct netdev_queue *nq = netdev_get_tx_queue(mp->dev, txq->index);1061 int reclaimed;1062 1063 __netif_tx_lock_bh(nq);1064 1065 reclaimed = 0;1066 while (reclaimed < budget && txq->tx_desc_count > 0) {1067 int tx_index;1068 struct tx_desc *desc;1069 u32 cmd_sts;1070 char desc_dma_map;1071 1072 tx_index = txq->tx_used_desc;1073 desc = &txq->tx_desc_area[tx_index];1074 desc_dma_map = txq->tx_desc_mapping[tx_index];1075 1076 cmd_sts = desc->cmd_sts;1077 1078 if (cmd_sts & BUFFER_OWNED_BY_DMA) {1079 if (!force)1080 break;1081 desc->cmd_sts = cmd_sts & ~BUFFER_OWNED_BY_DMA;1082 }1083 1084 txq->tx_used_desc = tx_index + 1;1085 if (txq->tx_used_desc == txq->tx_ring_size)1086 txq->tx_used_desc = 0;1087 1088 reclaimed++;1089 txq->tx_desc_count--;1090 1091 if (!IS_TSO_HEADER(txq, desc->buf_ptr)) {1092 1093 if (desc_dma_map == DESC_DMA_MAP_PAGE)1094 dma_unmap_page(mp->dev->dev.parent,1095 desc->buf_ptr,1096 desc->byte_cnt,1097 DMA_TO_DEVICE);1098 else1099 dma_unmap_single(mp->dev->dev.parent,1100 desc->buf_ptr,1101 desc->byte_cnt,1102 DMA_TO_DEVICE);1103 }1104 1105 if (cmd_sts & TX_ENABLE_INTERRUPT) {1106 struct sk_buff *skb = __skb_dequeue(&txq->tx_skb);1107 1108 if (!WARN_ON(!skb))1109 dev_consume_skb_any(skb);1110 }1111 1112 if (cmd_sts & ERROR_SUMMARY) {1113 netdev_info(mp->dev, "tx error\n");1114 mp->dev->stats.tx_errors++;1115 }1116 1117 }1118 1119 __netif_tx_unlock_bh(nq);1120 1121 if (reclaimed < budget)1122 mp->work_tx &= ~(1 << txq->index);1123 1124 return reclaimed;1125}1126 1127 1128/* tx rate control **********************************************************/1129/*1130 * Set total maximum TX rate (shared by all TX queues for this port)1131 * to 'rate' bits per second, with a maximum burst of 'burst' bytes.1132 */1133static void tx_set_rate(struct mv643xx_eth_private *mp, int rate, int burst)1134{1135 int token_rate;1136 int mtu;1137 int bucket_size;1138 1139 token_rate = ((rate / 1000) * 64) / (mp->t_clk / 1000);1140 if (token_rate > 1023)1141 token_rate = 1023;1142 1143 mtu = (mp->dev->mtu + 255) >> 8;1144 if (mtu > 63)1145 mtu = 63;1146 1147 bucket_size = (burst + 255) >> 8;1148 if (bucket_size > 65535)1149 bucket_size = 65535;1150 1151 switch (mp->shared->tx_bw_control) {1152 case TX_BW_CONTROL_OLD_LAYOUT:1153 wrlp(mp, TX_BW_RATE, token_rate);1154 wrlp(mp, TX_BW_MTU, mtu);1155 wrlp(mp, TX_BW_BURST, bucket_size);1156 break;1157 case TX_BW_CONTROL_NEW_LAYOUT:1158 wrlp(mp, TX_BW_RATE_MOVED, token_rate);1159 wrlp(mp, TX_BW_MTU_MOVED, mtu);1160 wrlp(mp, TX_BW_BURST_MOVED, bucket_size);1161 break;1162 }1163}1164 1165static void txq_set_rate(struct tx_queue *txq, int rate, int burst)1166{1167 struct mv643xx_eth_private *mp = txq_to_mp(txq);1168 int token_rate;1169 int bucket_size;1170 1171 token_rate = ((rate / 1000) * 64) / (mp->t_clk / 1000);1172 if (token_rate > 1023)1173 token_rate = 1023;1174 1175 bucket_size = (burst + 255) >> 8;1176 if (bucket_size > 65535)1177 bucket_size = 65535;1178 1179 wrlp(mp, TXQ_BW_TOKENS(txq->index), token_rate << 14);1180 wrlp(mp, TXQ_BW_CONF(txq->index), (bucket_size << 10) | token_rate);1181}1182 1183static void txq_set_fixed_prio_mode(struct tx_queue *txq)1184{1185 struct mv643xx_eth_private *mp = txq_to_mp(txq);1186 int off;1187 u32 val;1188 1189 /*1190 * Turn on fixed priority mode.1191 */1192 off = 0;1193 switch (mp->shared->tx_bw_control) {1194 case TX_BW_CONTROL_OLD_LAYOUT:1195 off = TXQ_FIX_PRIO_CONF;1196 break;1197 case TX_BW_CONTROL_NEW_LAYOUT:1198 off = TXQ_FIX_PRIO_CONF_MOVED;1199 break;1200 }1201 1202 if (off) {1203 val = rdlp(mp, off);1204 val |= 1 << txq->index;1205 wrlp(mp, off, val);1206 }1207}1208 1209 1210/* mii management interface *************************************************/1211static void mv643xx_eth_adjust_link(struct net_device *dev)1212{1213 struct mv643xx_eth_private *mp = netdev_priv(dev);1214 u32 pscr = rdlp(mp, PORT_SERIAL_CONTROL);1215 u32 autoneg_disable = FORCE_LINK_PASS |1216 DISABLE_AUTO_NEG_SPEED_GMII |1217 DISABLE_AUTO_NEG_FOR_FLOW_CTRL |1218 DISABLE_AUTO_NEG_FOR_DUPLEX;1219 1220 if (dev->phydev->autoneg == AUTONEG_ENABLE) {1221 /* enable auto negotiation */1222 pscr &= ~autoneg_disable;1223 goto out_write;1224 }1225 1226 pscr |= autoneg_disable;1227 1228 if (dev->phydev->speed == SPEED_1000) {1229 /* force gigabit, half duplex not supported */1230 pscr |= SET_GMII_SPEED_TO_1000;1231 pscr |= SET_FULL_DUPLEX_MODE;1232 goto out_write;1233 }1234 1235 pscr &= ~SET_GMII_SPEED_TO_1000;1236 1237 if (dev->phydev->speed == SPEED_100)1238 pscr |= SET_MII_SPEED_TO_100;1239 else1240 pscr &= ~SET_MII_SPEED_TO_100;1241 1242 if (dev->phydev->duplex == DUPLEX_FULL)1243 pscr |= SET_FULL_DUPLEX_MODE;1244 else1245 pscr &= ~SET_FULL_DUPLEX_MODE;1246 1247out_write:1248 wrlp(mp, PORT_SERIAL_CONTROL, pscr);1249}1250 1251/* statistics ***************************************************************/1252static struct net_device_stats *mv643xx_eth_get_stats(struct net_device *dev)1253{1254 struct mv643xx_eth_private *mp = netdev_priv(dev);1255 struct net_device_stats *stats = &dev->stats;1256 unsigned long tx_packets = 0;1257 unsigned long tx_bytes = 0;1258 unsigned long tx_dropped = 0;1259 int i;1260 1261 for (i = 0; i < mp->txq_count; i++) {1262 struct tx_queue *txq = mp->txq + i;1263 1264 tx_packets += txq->tx_packets;1265 tx_bytes += txq->tx_bytes;1266 tx_dropped += txq->tx_dropped;1267 }1268 1269 stats->tx_packets = tx_packets;1270 stats->tx_bytes = tx_bytes;1271 stats->tx_dropped = tx_dropped;1272 1273 return stats;1274}1275 1276static inline u32 mib_read(struct mv643xx_eth_private *mp, int offset)1277{1278 return rdl(mp, MIB_COUNTERS(mp->port_num) + offset);1279}1280 1281static void mib_counters_clear(struct mv643xx_eth_private *mp)1282{1283 int i;1284 1285 for (i = 0; i < 0x80; i += 4)1286 mib_read(mp, i);1287 1288 /* Clear non MIB hw counters also */1289 rdlp(mp, RX_DISCARD_FRAME_CNT);1290 rdlp(mp, RX_OVERRUN_FRAME_CNT);1291}1292 1293static void mib_counters_update(struct mv643xx_eth_private *mp)1294{1295 struct mib_counters *p = &mp->mib_counters;1296 1297 spin_lock_bh(&mp->mib_counters_lock);1298 p->good_octets_received += mib_read(mp, 0x00);1299 p->bad_octets_received += mib_read(mp, 0x08);1300 p->internal_mac_transmit_err += mib_read(mp, 0x0c);1301 p->good_frames_received += mib_read(mp, 0x10);1302 p->bad_frames_received += mib_read(mp, 0x14);1303 p->broadcast_frames_received += mib_read(mp, 0x18);1304 p->multicast_frames_received += mib_read(mp, 0x1c);1305 p->frames_64_octets += mib_read(mp, 0x20);1306 p->frames_65_to_127_octets += mib_read(mp, 0x24);1307 p->frames_128_to_255_octets += mib_read(mp, 0x28);1308 p->frames_256_to_511_octets += mib_read(mp, 0x2c);1309 p->frames_512_to_1023_octets += mib_read(mp, 0x30);1310 p->frames_1024_to_max_octets += mib_read(mp, 0x34);1311 p->good_octets_sent += mib_read(mp, 0x38);1312 p->good_frames_sent += mib_read(mp, 0x40);1313 p->excessive_collision += mib_read(mp, 0x44);1314 p->multicast_frames_sent += mib_read(mp, 0x48);1315 p->broadcast_frames_sent += mib_read(mp, 0x4c);1316 p->unrec_mac_control_received += mib_read(mp, 0x50);1317 p->fc_sent += mib_read(mp, 0x54);1318 p->good_fc_received += mib_read(mp, 0x58);1319 p->bad_fc_received += mib_read(mp, 0x5c);1320 p->undersize_received += mib_read(mp, 0x60);1321 p->fragments_received += mib_read(mp, 0x64);1322 p->oversize_received += mib_read(mp, 0x68);1323 p->jabber_received += mib_read(mp, 0x6c);1324 p->mac_receive_error += mib_read(mp, 0x70);1325 p->bad_crc_event += mib_read(mp, 0x74);1326 p->collision += mib_read(mp, 0x78);1327 p->late_collision += mib_read(mp, 0x7c);1328 /* Non MIB hardware counters */1329 p->rx_discard += rdlp(mp, RX_DISCARD_FRAME_CNT);1330 p->rx_overrun += rdlp(mp, RX_OVERRUN_FRAME_CNT);1331 spin_unlock_bh(&mp->mib_counters_lock);1332}1333 1334static void mib_counters_timer_wrapper(struct timer_list *t)1335{1336 struct mv643xx_eth_private *mp = from_timer(mp, t, mib_counters_timer);1337 mib_counters_update(mp);1338 mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ);1339}1340 1341 1342/* interrupt coalescing *****************************************************/1343/*1344 * Hardware coalescing parameters are set in units of 64 t_clk1345 * cycles. I.e.:1346 *1347 * coal_delay_in_usec = 64000000 * register_value / t_clk_rate1348 *1349 * register_value = coal_delay_in_usec * t_clk_rate / 640000001350 *1351 * In the ->set*() methods, we round the computed register value1352 * to the nearest integer.1353 */1354static unsigned int get_rx_coal(struct mv643xx_eth_private *mp)1355{1356 u32 val = rdlp(mp, SDMA_CONFIG);1357 u64 temp;1358 1359 if (mp->shared->extended_rx_coal_limit)1360 temp = ((val & 0x02000000) >> 10) | ((val & 0x003fff80) >> 7);1361 else1362 temp = (val & 0x003fff00) >> 8;1363 1364 temp *= 64000000;1365 temp += mp->t_clk / 2;1366 do_div(temp, mp->t_clk);1367 1368 return (unsigned int)temp;1369}1370 1371static void set_rx_coal(struct mv643xx_eth_private *mp, unsigned int usec)1372{1373 u64 temp;1374 u32 val;1375 1376 temp = (u64)usec * mp->t_clk;1377 temp += 31999999;1378 do_div(temp, 64000000);1379 1380 val = rdlp(mp, SDMA_CONFIG);1381 if (mp->shared->extended_rx_coal_limit) {1382 if (temp > 0xffff)1383 temp = 0xffff;1384 val &= ~0x023fff80;1385 val |= (temp & 0x8000) << 10;1386 val |= (temp & 0x7fff) << 7;1387 } else {1388 if (temp > 0x3fff)1389 temp = 0x3fff;1390 val &= ~0x003fff00;1391 val |= (temp & 0x3fff) << 8;1392 }1393 wrlp(mp, SDMA_CONFIG, val);1394}1395 1396static unsigned int get_tx_coal(struct mv643xx_eth_private *mp)1397{1398 u64 temp;1399 1400 temp = (rdlp(mp, TX_FIFO_URGENT_THRESHOLD) & 0x3fff0) >> 4;1401 temp *= 64000000;1402 temp += mp->t_clk / 2;1403 do_div(temp, mp->t_clk);1404 1405 return (unsigned int)temp;1406}1407 1408static void set_tx_coal(struct mv643xx_eth_private *mp, unsigned int usec)1409{1410 u64 temp;1411 1412 temp = (u64)usec * mp->t_clk;1413 temp += 31999999;1414 do_div(temp, 64000000);1415 1416 if (temp > 0x3fff)1417 temp = 0x3fff;1418 1419 wrlp(mp, TX_FIFO_URGENT_THRESHOLD, temp << 4);1420}1421 1422 1423/* ethtool ******************************************************************/1424struct mv643xx_eth_stats {1425 char stat_string[ETH_GSTRING_LEN];1426 int sizeof_stat;1427 int netdev_off;1428 int mp_off;1429};1430 1431#define SSTAT(m) \1432 { #m, sizeof_field(struct net_device_stats, m), \1433 offsetof(struct net_device, stats.m), -1 }1434 1435#define MIBSTAT(m) \1436 { #m, sizeof_field(struct mib_counters, m), \1437 -1, offsetof(struct mv643xx_eth_private, mib_counters.m) }1438 1439static const struct mv643xx_eth_stats mv643xx_eth_stats[] = {1440 SSTAT(rx_packets),1441 SSTAT(tx_packets),1442 SSTAT(rx_bytes),1443 SSTAT(tx_bytes),1444 SSTAT(rx_errors),1445 SSTAT(tx_errors),1446 SSTAT(rx_dropped),1447 SSTAT(tx_dropped),1448 MIBSTAT(good_octets_received),1449 MIBSTAT(bad_octets_received),1450 MIBSTAT(internal_mac_transmit_err),1451 MIBSTAT(good_frames_received),1452 MIBSTAT(bad_frames_received),1453 MIBSTAT(broadcast_frames_received),1454 MIBSTAT(multicast_frames_received),1455 MIBSTAT(frames_64_octets),1456 MIBSTAT(frames_65_to_127_octets),1457 MIBSTAT(frames_128_to_255_octets),1458 MIBSTAT(frames_256_to_511_octets),1459 MIBSTAT(frames_512_to_1023_octets),1460 MIBSTAT(frames_1024_to_max_octets),1461 MIBSTAT(good_octets_sent),1462 MIBSTAT(good_frames_sent),1463 MIBSTAT(excessive_collision),1464 MIBSTAT(multicast_frames_sent),1465 MIBSTAT(broadcast_frames_sent),1466 MIBSTAT(unrec_mac_control_received),1467 MIBSTAT(fc_sent),1468 MIBSTAT(good_fc_received),1469 MIBSTAT(bad_fc_received),1470 MIBSTAT(undersize_received),1471 MIBSTAT(fragments_received),1472 MIBSTAT(oversize_received),1473 MIBSTAT(jabber_received),1474 MIBSTAT(mac_receive_error),1475 MIBSTAT(bad_crc_event),1476 MIBSTAT(collision),1477 MIBSTAT(late_collision),1478 MIBSTAT(rx_discard),1479 MIBSTAT(rx_overrun),1480};1481 1482static int1483mv643xx_eth_get_link_ksettings_phy(struct mv643xx_eth_private *mp,1484 struct ethtool_link_ksettings *cmd)1485{1486 struct net_device *dev = mp->dev;1487 1488 phy_ethtool_ksettings_get(dev->phydev, cmd);1489 1490 /*1491 * The MAC does not support 1000baseT_Half.1492 */1493 linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,1494 cmd->link_modes.supported);1495 linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,1496 cmd->link_modes.advertising);1497 1498 return 0;1499}1500 1501static int1502mv643xx_eth_get_link_ksettings_phyless(struct mv643xx_eth_private *mp,1503 struct ethtool_link_ksettings *cmd)1504{1505 u32 port_status;1506 u32 supported, advertising;1507 1508 port_status = rdlp(mp, PORT_STATUS);1509 1510 supported = SUPPORTED_MII;1511 advertising = ADVERTISED_MII;1512 switch (port_status & PORT_SPEED_MASK) {1513 case PORT_SPEED_10:1514 cmd->base.speed = SPEED_10;1515 break;1516 case PORT_SPEED_100:1517 cmd->base.speed = SPEED_100;1518 break;1519 case PORT_SPEED_1000:1520 cmd->base.speed = SPEED_1000;1521 break;1522 default:1523 cmd->base.speed = -1;1524 break;1525 }1526 cmd->base.duplex = (port_status & FULL_DUPLEX) ?1527 DUPLEX_FULL : DUPLEX_HALF;1528 cmd->base.port = PORT_MII;1529 cmd->base.phy_address = 0;1530 cmd->base.autoneg = AUTONEG_DISABLE;1531 1532 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,1533 supported);1534 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,1535 advertising);1536 1537 return 0;1538}1539 1540static void1541mv643xx_eth_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)1542{1543 wol->supported = 0;1544 wol->wolopts = 0;1545 if (dev->phydev)1546 phy_ethtool_get_wol(dev->phydev, wol);1547}1548 1549static int1550mv643xx_eth_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)1551{1552 int err;1553 1554 if (!dev->phydev)1555 return -EOPNOTSUPP;1556 1557 err = phy_ethtool_set_wol(dev->phydev, wol);1558 /* Given that mv643xx_eth works without the marvell-specific PHY driver,1559 * this debugging hint is useful to have.1560 */1561 if (err == -EOPNOTSUPP)1562 netdev_info(dev, "The PHY does not support set_wol, was CONFIG_MARVELL_PHY enabled?\n");1563 return err;1564}1565 1566static int1567mv643xx_eth_get_link_ksettings(struct net_device *dev,1568 struct ethtool_link_ksettings *cmd)1569{1570 struct mv643xx_eth_private *mp = netdev_priv(dev);1571 1572 if (dev->phydev)1573 return mv643xx_eth_get_link_ksettings_phy(mp, cmd);1574 else1575 return mv643xx_eth_get_link_ksettings_phyless(mp, cmd);1576}1577 1578static int1579mv643xx_eth_set_link_ksettings(struct net_device *dev,1580 const struct ethtool_link_ksettings *cmd)1581{1582 struct ethtool_link_ksettings c = *cmd;1583 u32 advertising;1584 int ret;1585 1586 if (!dev->phydev)1587 return -EINVAL;1588 1589 /*1590 * The MAC does not support 1000baseT_Half.1591 */1592 ethtool_convert_link_mode_to_legacy_u32(&advertising,1593 c.link_modes.advertising);1594 advertising &= ~ADVERTISED_1000baseT_Half;1595 ethtool_convert_legacy_u32_to_link_mode(c.link_modes.advertising,1596 advertising);1597 1598 ret = phy_ethtool_ksettings_set(dev->phydev, &c);1599 if (!ret)1600 mv643xx_eth_adjust_link(dev);1601 return ret;1602}1603 1604static void mv643xx_eth_get_drvinfo(struct net_device *dev,1605 struct ethtool_drvinfo *drvinfo)1606{1607 strscpy(drvinfo->driver, mv643xx_eth_driver_name,1608 sizeof(drvinfo->driver));1609 strscpy(drvinfo->version, mv643xx_eth_driver_version,1610 sizeof(drvinfo->version));1611 strscpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));1612 strscpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));1613}1614 1615static int mv643xx_eth_get_coalesce(struct net_device *dev,1616 struct ethtool_coalesce *ec,1617 struct kernel_ethtool_coalesce *kernel_coal,1618 struct netlink_ext_ack *extack)1619{1620 struct mv643xx_eth_private *mp = netdev_priv(dev);1621 1622 ec->rx_coalesce_usecs = get_rx_coal(mp);1623 ec->tx_coalesce_usecs = get_tx_coal(mp);1624 1625 return 0;1626}1627 1628static int mv643xx_eth_set_coalesce(struct net_device *dev,1629 struct ethtool_coalesce *ec,1630 struct kernel_ethtool_coalesce *kernel_coal,1631 struct netlink_ext_ack *extack)1632{1633 struct mv643xx_eth_private *mp = netdev_priv(dev);1634 1635 set_rx_coal(mp, ec->rx_coalesce_usecs);1636 set_tx_coal(mp, ec->tx_coalesce_usecs);1637 1638 return 0;1639}1640 1641static void1642mv643xx_eth_get_ringparam(struct net_device *dev, struct ethtool_ringparam *er,1643 struct kernel_ethtool_ringparam *kernel_er,1644 struct netlink_ext_ack *extack)1645{1646 struct mv643xx_eth_private *mp = netdev_priv(dev);1647 1648 er->rx_max_pending = 4096;1649 er->tx_max_pending = 4096;1650 1651 er->rx_pending = mp->rx_ring_size;1652 er->tx_pending = mp->tx_ring_size;1653}1654 1655static int1656mv643xx_eth_set_ringparam(struct net_device *dev, struct ethtool_ringparam *er,1657 struct kernel_ethtool_ringparam *kernel_er,1658 struct netlink_ext_ack *extack)1659{1660 struct mv643xx_eth_private *mp = netdev_priv(dev);1661 1662 if (er->rx_mini_pending || er->rx_jumbo_pending)1663 return -EINVAL;1664 1665 mp->rx_ring_size = min(er->rx_pending, 4096U);1666 mp->tx_ring_size = clamp_t(unsigned int, er->tx_pending,1667 MV643XX_MAX_SKB_DESCS * 2, 4096);1668 if (mp->tx_ring_size != er->tx_pending)1669 netdev_warn(dev, "TX queue size set to %u (requested %u)\n",1670 mp->tx_ring_size, er->tx_pending);1671 1672 if (netif_running(dev)) {1673 mv643xx_eth_stop(dev);1674 if (mv643xx_eth_open(dev)) {1675 netdev_err(dev,1676 "fatal error on re-opening device after ring param change\n");1677 return -ENOMEM;1678 }1679 }1680 1681 return 0;1682}1683 1684 1685static int1686mv643xx_eth_set_features(struct net_device *dev, netdev_features_t features)1687{1688 struct mv643xx_eth_private *mp = netdev_priv(dev);1689 bool rx_csum = features & NETIF_F_RXCSUM;1690 1691 wrlp(mp, PORT_CONFIG, rx_csum ? 0x02000000 : 0x00000000);1692 1693 return 0;1694}1695 1696static void mv643xx_eth_get_strings(struct net_device *dev,1697 uint32_t stringset, uint8_t *data)1698{1699 int i;1700 1701 if (stringset == ETH_SS_STATS) {1702 for (i = 0; i < ARRAY_SIZE(mv643xx_eth_stats); i++) {1703 memcpy(data + i * ETH_GSTRING_LEN,1704 mv643xx_eth_stats[i].stat_string,1705 ETH_GSTRING_LEN);1706 }1707 }1708}1709 1710static void mv643xx_eth_get_ethtool_stats(struct net_device *dev,1711 struct ethtool_stats *stats,1712 uint64_t *data)1713{1714 struct mv643xx_eth_private *mp = netdev_priv(dev);1715 int i;1716 1717 mv643xx_eth_get_stats(dev);1718 mib_counters_update(mp);1719 1720 for (i = 0; i < ARRAY_SIZE(mv643xx_eth_stats); i++) {1721 const struct mv643xx_eth_stats *stat;1722 void *p;1723 1724 stat = mv643xx_eth_stats + i;1725 1726 if (stat->netdev_off >= 0)1727 p = ((void *)mp->dev) + stat->netdev_off;1728 else1729 p = ((void *)mp) + stat->mp_off;1730 1731 data[i] = (stat->sizeof_stat == 8) ?1732 *(uint64_t *)p : *(uint32_t *)p;1733 }1734}1735 1736static int mv643xx_eth_get_sset_count(struct net_device *dev, int sset)1737{1738 if (sset == ETH_SS_STATS)1739 return ARRAY_SIZE(mv643xx_eth_stats);1740 1741 return -EOPNOTSUPP;1742}1743 1744static const struct ethtool_ops mv643xx_eth_ethtool_ops = {1745 .supported_coalesce_params = ETHTOOL_COALESCE_USECS,1746 .get_drvinfo = mv643xx_eth_get_drvinfo,1747 .nway_reset = phy_ethtool_nway_reset,1748 .get_link = ethtool_op_get_link,1749 .get_coalesce = mv643xx_eth_get_coalesce,1750 .set_coalesce = mv643xx_eth_set_coalesce,1751 .get_ringparam = mv643xx_eth_get_ringparam,1752 .set_ringparam = mv643xx_eth_set_ringparam,1753 .get_strings = mv643xx_eth_get_strings,1754 .get_ethtool_stats = mv643xx_eth_get_ethtool_stats,1755 .get_sset_count = mv643xx_eth_get_sset_count,1756 .get_ts_info = ethtool_op_get_ts_info,1757 .get_wol = mv643xx_eth_get_wol,1758 .set_wol = mv643xx_eth_set_wol,1759 .get_link_ksettings = mv643xx_eth_get_link_ksettings,1760 .set_link_ksettings = mv643xx_eth_set_link_ksettings,1761};1762 1763 1764/* address handling *********************************************************/1765static void uc_addr_get(struct mv643xx_eth_private *mp, unsigned char *addr)1766{1767 unsigned int mac_h = rdlp(mp, MAC_ADDR_HIGH);1768 unsigned int mac_l = rdlp(mp, MAC_ADDR_LOW);1769 1770 addr[0] = (mac_h >> 24) & 0xff;1771 addr[1] = (mac_h >> 16) & 0xff;1772 addr[2] = (mac_h >> 8) & 0xff;1773 addr[3] = mac_h & 0xff;1774 addr[4] = (mac_l >> 8) & 0xff;1775 addr[5] = mac_l & 0xff;1776}1777 1778static void uc_addr_set(struct mv643xx_eth_private *mp, const u8 *addr)1779{1780 wrlp(mp, MAC_ADDR_HIGH,1781 (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3]);1782 wrlp(mp, MAC_ADDR_LOW, (addr[4] << 8) | addr[5]);1783}1784 1785static u32 uc_addr_filter_mask(struct net_device *dev)1786{1787 struct netdev_hw_addr *ha;1788 u32 nibbles;1789 1790 if (dev->flags & IFF_PROMISC)1791 return 0;1792 1793 nibbles = 1 << (dev->dev_addr[5] & 0x0f);1794 netdev_for_each_uc_addr(ha, dev) {1795 if (memcmp(dev->dev_addr, ha->addr, 5))1796 return 0;1797 if ((dev->dev_addr[5] ^ ha->addr[5]) & 0xf0)1798 return 0;1799 1800 nibbles |= 1 << (ha->addr[5] & 0x0f);1801 }1802 1803 return nibbles;1804}1805 1806static void mv643xx_eth_program_unicast_filter(struct net_device *dev)1807{1808 struct mv643xx_eth_private *mp = netdev_priv(dev);1809 u32 port_config;1810 u32 nibbles;1811 int i;1812 1813 uc_addr_set(mp, dev->dev_addr);1814 1815 port_config = rdlp(mp, PORT_CONFIG) & ~UNICAST_PROMISCUOUS_MODE;1816 1817 nibbles = uc_addr_filter_mask(dev);1818 if (!nibbles) {1819 port_config |= UNICAST_PROMISCUOUS_MODE;1820 nibbles = 0xffff;1821 }1822 1823 for (i = 0; i < 16; i += 4) {1824 int off = UNICAST_TABLE(mp->port_num) + i;1825 u32 v;1826 1827 v = 0;1828 if (nibbles & 1)1829 v |= 0x00000001;1830 if (nibbles & 2)1831 v |= 0x00000100;1832 if (nibbles & 4)1833 v |= 0x00010000;1834 if (nibbles & 8)1835 v |= 0x01000000;1836 nibbles >>= 4;1837 1838 wrl(mp, off, v);1839 }1840 1841 wrlp(mp, PORT_CONFIG, port_config);1842}1843 1844static int addr_crc(unsigned char *addr)1845{1846 int crc = 0;1847 int i;1848 1849 for (i = 0; i < 6; i++) {1850 int j;1851 1852 crc = (crc ^ addr[i]) << 8;1853 for (j = 7; j >= 0; j--) {1854 if (crc & (0x100 << j))1855 crc ^= 0x107 << j;1856 }1857 }1858 1859 return crc;1860}1861 1862static void mv643xx_eth_program_multicast_filter(struct net_device *dev)1863{1864 struct mv643xx_eth_private *mp = netdev_priv(dev);1865 u32 *mc_spec;1866 u32 *mc_other;1867 struct netdev_hw_addr *ha;1868 int i;1869 1870 if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI))1871 goto promiscuous;1872 1873 /* Allocate both mc_spec and mc_other tables */1874 mc_spec = kcalloc(128, sizeof(u32), GFP_ATOMIC);1875 if (!mc_spec)1876 goto promiscuous;1877 mc_other = &mc_spec[64];1878 1879 netdev_for_each_mc_addr(ha, dev) {1880 u8 *a = ha->addr;1881 u32 *table;1882 u8 entry;1883 1884 if (memcmp(a, "\x01\x00\x5e\x00\x00", 5) == 0) {1885 table = mc_spec;1886 entry = a[5];1887 } else {1888 table = mc_other;1889 entry = addr_crc(a);1890 }1891 1892 table[entry >> 2] |= 1 << (8 * (entry & 3));1893 }1894 1895 for (i = 0; i < 64; i++) {1896 wrl(mp, SPECIAL_MCAST_TABLE(mp->port_num) + i * sizeof(u32),1897 mc_spec[i]);1898 wrl(mp, OTHER_MCAST_TABLE(mp->port_num) + i * sizeof(u32),1899 mc_other[i]);1900 }1901 1902 kfree(mc_spec);1903 return;1904 1905promiscuous:1906 for (i = 0; i < 64; i++) {1907 wrl(mp, SPECIAL_MCAST_TABLE(mp->port_num) + i * sizeof(u32),1908 0x01010101u);1909 wrl(mp, OTHER_MCAST_TABLE(mp->port_num) + i * sizeof(u32),1910 0x01010101u);1911 }1912}1913 1914static void mv643xx_eth_set_rx_mode(struct net_device *dev)1915{1916 mv643xx_eth_program_unicast_filter(dev);1917 mv643xx_eth_program_multicast_filter(dev);1918}1919 1920static int mv643xx_eth_set_mac_address(struct net_device *dev, void *addr)1921{1922 struct sockaddr *sa = addr;1923 1924 if (!is_valid_ether_addr(sa->sa_data))1925 return -EADDRNOTAVAIL;1926 1927 eth_hw_addr_set(dev, sa->sa_data);1928 1929 netif_addr_lock_bh(dev);1930 mv643xx_eth_program_unicast_filter(dev);1931 netif_addr_unlock_bh(dev);1932 1933 return 0;1934}1935 1936 1937/* rx/tx queue initialisation ***********************************************/1938static int rxq_init(struct mv643xx_eth_private *mp, int index)1939{1940 struct rx_queue *rxq = mp->rxq + index;1941 struct rx_desc *rx_desc;1942 int size;1943 int i;1944 1945 rxq->index = index;1946 1947 rxq->rx_ring_size = mp->rx_ring_size;1948 1949 rxq->rx_desc_count = 0;1950 rxq->rx_curr_desc = 0;1951 rxq->rx_used_desc = 0;1952 1953 size = rxq->rx_ring_size * sizeof(struct rx_desc);1954 1955 if (index == 0 && size <= mp->rx_desc_sram_size) {1956 rxq->rx_desc_area = ioremap(mp->rx_desc_sram_addr,1957 mp->rx_desc_sram_size);1958 rxq->rx_desc_dma = mp->rx_desc_sram_addr;1959 } else {1960 rxq->rx_desc_area = dma_alloc_coherent(mp->dev->dev.parent,1961 size, &rxq->rx_desc_dma,1962 GFP_KERNEL);1963 }1964 1965 if (rxq->rx_desc_area == NULL) {1966 netdev_err(mp->dev,1967 "can't allocate rx ring (%d bytes)\n", size);1968 goto out;1969 }1970 memset(rxq->rx_desc_area, 0, size);1971 1972 rxq->rx_desc_area_size = size;1973 rxq->rx_skb = kcalloc(rxq->rx_ring_size, sizeof(*rxq->rx_skb),1974 GFP_KERNEL);1975 if (rxq->rx_skb == NULL)1976 goto out_free;1977 1978 rx_desc = rxq->rx_desc_area;1979 for (i = 0; i < rxq->rx_ring_size; i++) {1980 int nexti;1981 1982 nexti = i + 1;1983 if (nexti == rxq->rx_ring_size)1984 nexti = 0;1985 1986 rx_desc[i].next_desc_ptr = rxq->rx_desc_dma +1987 nexti * sizeof(struct rx_desc);1988 }1989 1990 return 0;1991 1992 1993out_free:1994 if (index == 0 && size <= mp->rx_desc_sram_size)1995 iounmap(rxq->rx_desc_area);1996 else1997 dma_free_coherent(mp->dev->dev.parent, size,1998 rxq->rx_desc_area,1999 rxq->rx_desc_dma);2000 2001out:2002 return -ENOMEM;2003}2004 2005static void rxq_deinit(struct rx_queue *rxq)2006{2007 struct mv643xx_eth_private *mp = rxq_to_mp(rxq);2008 int i;2009 2010 rxq_disable(rxq);2011 2012 for (i = 0; i < rxq->rx_ring_size; i++) {2013 if (rxq->rx_skb[i]) {2014 dev_consume_skb_any(rxq->rx_skb[i]);2015 rxq->rx_desc_count--;2016 }2017 }2018 2019 if (rxq->rx_desc_count) {2020 netdev_err(mp->dev, "error freeing rx ring -- %d skbs stuck\n",2021 rxq->rx_desc_count);2022 }2023 2024 if (rxq->index == 0 &&2025 rxq->rx_desc_area_size <= mp->rx_desc_sram_size)2026 iounmap(rxq->rx_desc_area);2027 else2028 dma_free_coherent(mp->dev->dev.parent, rxq->rx_desc_area_size,2029 rxq->rx_desc_area, rxq->rx_desc_dma);2030 2031 kfree(rxq->rx_skb);2032}2033 2034static int txq_init(struct mv643xx_eth_private *mp, int index)2035{2036 struct tx_queue *txq = mp->txq + index;2037 struct tx_desc *tx_desc;2038 int size;2039 int ret;2040 int i;2041 2042 txq->index = index;2043 2044 txq->tx_ring_size = mp->tx_ring_size;2045 2046 /* A queue must always have room for at least one skb.2047 * Therefore, stop the queue when the free entries reaches2048 * the maximum number of descriptors per skb.2049 */2050 txq->tx_stop_threshold = txq->tx_ring_size - MV643XX_MAX_SKB_DESCS;2051 txq->tx_wake_threshold = txq->tx_stop_threshold / 2;2052 2053 txq->tx_desc_count = 0;2054 txq->tx_curr_desc = 0;2055 txq->tx_used_desc = 0;2056 2057 size = txq->tx_ring_size * sizeof(struct tx_desc);2058 2059 if (index == 0 && size <= mp->tx_desc_sram_size) {2060 txq->tx_desc_area = ioremap(mp->tx_desc_sram_addr,2061 mp->tx_desc_sram_size);2062 txq->tx_desc_dma = mp->tx_desc_sram_addr;2063 } else {2064 txq->tx_desc_area = dma_alloc_coherent(mp->dev->dev.parent,2065 size, &txq->tx_desc_dma,2066 GFP_KERNEL);2067 }2068 2069 if (txq->tx_desc_area == NULL) {2070 netdev_err(mp->dev,2071 "can't allocate tx ring (%d bytes)\n", size);2072 return -ENOMEM;2073 }2074 memset(txq->tx_desc_area, 0, size);2075 2076 txq->tx_desc_area_size = size;2077 2078 tx_desc = txq->tx_desc_area;2079 for (i = 0; i < txq->tx_ring_size; i++) {2080 struct tx_desc *txd = tx_desc + i;2081 int nexti;2082 2083 nexti = i + 1;2084 if (nexti == txq->tx_ring_size)2085 nexti = 0;2086 2087 txd->cmd_sts = 0;2088 txd->next_desc_ptr = txq->tx_desc_dma +2089 nexti * sizeof(struct tx_desc);2090 }2091 2092 txq->tx_desc_mapping = kcalloc(txq->tx_ring_size, sizeof(char),2093 GFP_KERNEL);2094 if (!txq->tx_desc_mapping) {2095 ret = -ENOMEM;2096 goto err_free_desc_area;2097 }2098 2099 /* Allocate DMA buffers for TSO MAC/IP/TCP headers */2100 txq->tso_hdrs = dma_alloc_coherent(mp->dev->dev.parent,2101 txq->tx_ring_size * TSO_HEADER_SIZE,2102 &txq->tso_hdrs_dma, GFP_KERNEL);2103 if (txq->tso_hdrs == NULL) {2104 ret = -ENOMEM;2105 goto err_free_desc_mapping;2106 }2107 skb_queue_head_init(&txq->tx_skb);2108 2109 return 0;2110 2111err_free_desc_mapping:2112 kfree(txq->tx_desc_mapping);2113err_free_desc_area:2114 if (index == 0 && size <= mp->tx_desc_sram_size)2115 iounmap(txq->tx_desc_area);2116 else2117 dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size,2118 txq->tx_desc_area, txq->tx_desc_dma);2119 return ret;2120}2121 2122static void txq_deinit(struct tx_queue *txq)2123{2124 struct mv643xx_eth_private *mp = txq_to_mp(txq);2125 2126 txq_disable(txq);2127 txq_reclaim(txq, txq->tx_ring_size, 1);2128 2129 BUG_ON(txq->tx_used_desc != txq->tx_curr_desc);2130 2131 if (txq->index == 0 &&2132 txq->tx_desc_area_size <= mp->tx_desc_sram_size)2133 iounmap(txq->tx_desc_area);2134 else2135 dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size,2136 txq->tx_desc_area, txq->tx_desc_dma);2137 kfree(txq->tx_desc_mapping);2138 2139 if (txq->tso_hdrs)2140 dma_free_coherent(mp->dev->dev.parent,2141 txq->tx_ring_size * TSO_HEADER_SIZE,2142 txq->tso_hdrs, txq->tso_hdrs_dma);2143}2144 2145 2146/* netdev ops and related ***************************************************/2147static int mv643xx_eth_collect_events(struct mv643xx_eth_private *mp)2148{2149 u32 int_cause;2150 u32 int_cause_ext;2151 2152 int_cause = rdlp(mp, INT_CAUSE) & mp->int_mask;2153 if (int_cause == 0)2154 return 0;2155 2156 int_cause_ext = 0;2157 if (int_cause & INT_EXT) {2158 int_cause &= ~INT_EXT;2159 int_cause_ext = rdlp(mp, INT_CAUSE_EXT);2160 }2161 2162 if (int_cause) {2163 wrlp(mp, INT_CAUSE, ~int_cause);2164 mp->work_tx_end |= ((int_cause & INT_TX_END) >> 19) &2165 ~(rdlp(mp, TXQ_COMMAND) & 0xff);2166 mp->work_rx |= (int_cause & INT_RX) >> 2;2167 }2168 2169 int_cause_ext &= INT_EXT_LINK_PHY | INT_EXT_TX;2170 if (int_cause_ext) {2171 wrlp(mp, INT_CAUSE_EXT, ~int_cause_ext);2172 if (int_cause_ext & INT_EXT_LINK_PHY)2173 mp->work_link = 1;2174 mp->work_tx |= int_cause_ext & INT_EXT_TX;2175 }2176 2177 return 1;2178}2179 2180static irqreturn_t mv643xx_eth_irq(int irq, void *dev_id)2181{2182 struct net_device *dev = (struct net_device *)dev_id;2183 struct mv643xx_eth_private *mp = netdev_priv(dev);2184 2185 if (unlikely(!mv643xx_eth_collect_events(mp)))2186 return IRQ_NONE;2187 2188 wrlp(mp, INT_MASK, 0);2189 napi_schedule(&mp->napi);2190 2191 return IRQ_HANDLED;2192}2193 2194static void handle_link_event(struct mv643xx_eth_private *mp)2195{2196 struct net_device *dev = mp->dev;2197 u32 port_status;2198 int speed;2199 int duplex;2200 int fc;2201 2202 port_status = rdlp(mp, PORT_STATUS);2203 if (!(port_status & LINK_UP)) {2204 if (netif_carrier_ok(dev)) {2205 int i;2206 2207 netdev_info(dev, "link down\n");2208 2209 netif_carrier_off(dev);2210 2211 for (i = 0; i < mp->txq_count; i++) {2212 struct tx_queue *txq = mp->txq + i;2213 2214 txq_reclaim(txq, txq->tx_ring_size, 1);2215 txq_reset_hw_ptr(txq);2216 }2217 }2218 return;2219 }2220 2221 switch (port_status & PORT_SPEED_MASK) {2222 case PORT_SPEED_10:2223 speed = 10;2224 break;2225 case PORT_SPEED_100:2226 speed = 100;2227 break;2228 case PORT_SPEED_1000:2229 speed = 1000;2230 break;2231 default:2232 speed = -1;2233 break;2234 }2235 duplex = (port_status & FULL_DUPLEX) ? 1 : 0;2236 fc = (port_status & FLOW_CONTROL_ENABLED) ? 1 : 0;2237 2238 netdev_info(dev, "link up, %d Mb/s, %s duplex, flow control %sabled\n",2239 speed, duplex ? "full" : "half", fc ? "en" : "dis");2240 2241 if (!netif_carrier_ok(dev))2242 netif_carrier_on(dev);2243}2244 2245static int mv643xx_eth_poll(struct napi_struct *napi, int budget)2246{2247 struct mv643xx_eth_private *mp;2248 int work_done;2249 2250 mp = container_of(napi, struct mv643xx_eth_private, napi);2251 2252 if (unlikely(mp->oom)) {2253 mp->oom = 0;2254 del_timer(&mp->rx_oom);2255 }2256 2257 work_done = 0;2258 while (work_done < budget) {2259 u8 queue_mask;2260 int queue;2261 int work_tbd;2262 2263 if (mp->work_link) {2264 mp->work_link = 0;2265 handle_link_event(mp);2266 work_done++;2267 continue;2268 }2269 2270 queue_mask = mp->work_tx | mp->work_tx_end | mp->work_rx;2271 if (likely(!mp->oom))2272 queue_mask |= mp->work_rx_refill;2273 2274 if (!queue_mask) {2275 if (mv643xx_eth_collect_events(mp))2276 continue;2277 break;2278 }2279 2280 queue = fls(queue_mask) - 1;2281 queue_mask = 1 << queue;2282 2283 work_tbd = budget - work_done;2284 if (work_tbd > 16)2285 work_tbd = 16;2286 2287 if (mp->work_tx_end & queue_mask) {2288 txq_kick(mp->txq + queue);2289 } else if (mp->work_tx & queue_mask) {2290 work_done += txq_reclaim(mp->txq + queue, work_tbd, 0);2291 txq_maybe_wake(mp->txq + queue);2292 } else if (mp->work_rx & queue_mask) {2293 work_done += rxq_process(mp->rxq + queue, work_tbd);2294 } else if (!mp->oom && (mp->work_rx_refill & queue_mask)) {2295 work_done += rxq_refill(mp->rxq + queue, work_tbd);2296 } else {2297 BUG();2298 }2299 }2300 2301 if (work_done < budget) {2302 if (mp->oom)2303 mod_timer(&mp->rx_oom, jiffies + (HZ / 10));2304 napi_complete_done(napi, work_done);2305 wrlp(mp, INT_MASK, mp->int_mask);2306 }2307 2308 return work_done;2309}2310 2311static inline void oom_timer_wrapper(struct timer_list *t)2312{2313 struct mv643xx_eth_private *mp = from_timer(mp, t, rx_oom);2314 2315 napi_schedule(&mp->napi);2316}2317 2318static void port_start(struct mv643xx_eth_private *mp)2319{2320 struct net_device *dev = mp->dev;2321 u32 pscr;2322 int i;2323 2324 /*2325 * Perform PHY reset, if there is a PHY.2326 */2327 if (dev->phydev) {2328 struct ethtool_link_ksettings cmd;2329 2330 mv643xx_eth_get_link_ksettings(dev, &cmd);2331 phy_init_hw(dev->phydev);2332 mv643xx_eth_set_link_ksettings(2333 dev, (const struct ethtool_link_ksettings *)&cmd);2334 phy_start(dev->phydev);2335 }2336 2337 /*2338 * Configure basic link parameters.2339 */2340 pscr = rdlp(mp, PORT_SERIAL_CONTROL);2341 2342 pscr |= SERIAL_PORT_ENABLE;2343 wrlp(mp, PORT_SERIAL_CONTROL, pscr);2344 2345 pscr |= DO_NOT_FORCE_LINK_FAIL;2346 if (!dev->phydev)2347 pscr |= FORCE_LINK_PASS;2348 wrlp(mp, PORT_SERIAL_CONTROL, pscr);2349 2350 /*2351 * Configure TX path and queues.2352 */2353 tx_set_rate(mp, 1000000000, 16777216);2354 for (i = 0; i < mp->txq_count; i++) {2355 struct tx_queue *txq = mp->txq + i;2356 2357 txq_reset_hw_ptr(txq);2358 txq_set_rate(txq, 1000000000, 16777216);2359 txq_set_fixed_prio_mode(txq);2360 }2361 2362 /*2363 * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast2364 * frames to RX queue #0, and include the pseudo-header when2365 * calculating receive checksums.2366 */2367 mv643xx_eth_set_features(mp->dev, mp->dev->features);2368 2369 /*2370 * Treat BPDUs as normal multicasts, and disable partition mode.2371 */2372 wrlp(mp, PORT_CONFIG_EXT, 0x00000000);2373 2374 /*2375 * Add configured unicast addresses to address filter table.2376 */2377 mv643xx_eth_program_unicast_filter(mp->dev);2378 2379 /*2380 * Enable the receive queues.2381 */2382 for (i = 0; i < mp->rxq_count; i++) {2383 struct rx_queue *rxq = mp->rxq + i;2384 u32 addr;2385 2386 addr = (u32)rxq->rx_desc_dma;2387 addr += rxq->rx_curr_desc * sizeof(struct rx_desc);2388 wrlp(mp, RXQ_CURRENT_DESC_PTR(i), addr);2389 2390 rxq_enable(rxq);2391 }2392}2393 2394static void mv643xx_eth_recalc_skb_size(struct mv643xx_eth_private *mp)2395{2396 int skb_size;2397 2398 /*2399 * Reserve 2+14 bytes for an ethernet header (the hardware2400 * automatically prepends 2 bytes of dummy data to each2401 * received packet), 16 bytes for up to four VLAN tags, and2402 * 4 bytes for the trailing FCS -- 36 bytes total.2403 */2404 skb_size = mp->dev->mtu + 36;2405 2406 /*2407 * Make sure that the skb size is a multiple of 8 bytes, as2408 * the lower three bits of the receive descriptor's buffer2409 * size field are ignored by the hardware.2410 */2411 mp->skb_size = (skb_size + 7) & ~7;2412 2413 /*2414 * If NET_SKB_PAD is smaller than a cache line,2415 * netdev_alloc_skb() will cause skb->data to be misaligned2416 * to a cache line boundary. If this is the case, include2417 * some extra space to allow re-aligning the data area.2418 */2419 mp->skb_size += SKB_DMA_REALIGN;2420}2421 2422static int mv643xx_eth_open(struct net_device *dev)2423{2424 struct mv643xx_eth_private *mp = netdev_priv(dev);2425 int err;2426 int i;2427 2428 wrlp(mp, INT_CAUSE, 0);2429 wrlp(mp, INT_CAUSE_EXT, 0);2430 rdlp(mp, INT_CAUSE_EXT);2431 2432 err = request_irq(dev->irq, mv643xx_eth_irq,2433 IRQF_SHARED, dev->name, dev);2434 if (err) {2435 netdev_err(dev, "can't assign irq\n");2436 return -EAGAIN;2437 }2438 2439 mv643xx_eth_recalc_skb_size(mp);2440 2441 napi_enable(&mp->napi);2442 2443 mp->int_mask = INT_EXT;2444 2445 for (i = 0; i < mp->rxq_count; i++) {2446 err = rxq_init(mp, i);2447 if (err) {2448 while (--i >= 0)2449 rxq_deinit(mp->rxq + i);2450 goto out;2451 }2452 2453 rxq_refill(mp->rxq + i, INT_MAX);2454 mp->int_mask |= INT_RX_0 << i;2455 }2456 2457 if (mp->oom) {2458 mp->rx_oom.expires = jiffies + (HZ / 10);2459 add_timer(&mp->rx_oom);2460 }2461 2462 for (i = 0; i < mp->txq_count; i++) {2463 err = txq_init(mp, i);2464 if (err) {2465 while (--i >= 0)2466 txq_deinit(mp->txq + i);2467 goto out_free;2468 }2469 mp->int_mask |= INT_TX_END_0 << i;2470 }2471 2472 add_timer(&mp->mib_counters_timer);2473 port_start(mp);2474 2475 wrlp(mp, INT_MASK_EXT, INT_EXT_LINK_PHY | INT_EXT_TX);2476 wrlp(mp, INT_MASK, mp->int_mask);2477 2478 return 0;2479 2480 2481out_free:2482 for (i = 0; i < mp->rxq_count; i++)2483 rxq_deinit(mp->rxq + i);2484out:2485 napi_disable(&mp->napi);2486 free_irq(dev->irq, dev);2487 2488 return err;2489}2490 2491static void port_reset(struct mv643xx_eth_private *mp)2492{2493 unsigned int data;2494 int i;2495 2496 for (i = 0; i < mp->rxq_count; i++)2497 rxq_disable(mp->rxq + i);2498 for (i = 0; i < mp->txq_count; i++)2499 txq_disable(mp->txq + i);2500 2501 while (1) {2502 u32 ps = rdlp(mp, PORT_STATUS);2503 2504 if ((ps & (TX_IN_PROGRESS | TX_FIFO_EMPTY)) == TX_FIFO_EMPTY)2505 break;2506 udelay(10);2507 }2508 2509 /* Reset the Enable bit in the Configuration Register */2510 data = rdlp(mp, PORT_SERIAL_CONTROL);2511 data &= ~(SERIAL_PORT_ENABLE |2512 DO_NOT_FORCE_LINK_FAIL |2513 FORCE_LINK_PASS);2514 wrlp(mp, PORT_SERIAL_CONTROL, data);2515}2516 2517static int mv643xx_eth_stop(struct net_device *dev)2518{2519 struct mv643xx_eth_private *mp = netdev_priv(dev);2520 int i;2521 2522 wrlp(mp, INT_MASK_EXT, 0x00000000);2523 wrlp(mp, INT_MASK, 0x00000000);2524 rdlp(mp, INT_MASK);2525 2526 napi_disable(&mp->napi);2527 2528 del_timer_sync(&mp->rx_oom);2529 2530 netif_carrier_off(dev);2531 if (dev->phydev)2532 phy_stop(dev->phydev);2533 free_irq(dev->irq, dev);2534 2535 port_reset(mp);2536 mv643xx_eth_get_stats(dev);2537 mib_counters_update(mp);2538 del_timer_sync(&mp->mib_counters_timer);2539 2540 for (i = 0; i < mp->rxq_count; i++)2541 rxq_deinit(mp->rxq + i);2542 for (i = 0; i < mp->txq_count; i++)2543 txq_deinit(mp->txq + i);2544 2545 return 0;2546}2547 2548static int mv643xx_eth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)2549{2550 int ret;2551 2552 if (!dev->phydev)2553 return -ENOTSUPP;2554 2555 ret = phy_mii_ioctl(dev->phydev, ifr, cmd);2556 if (!ret)2557 mv643xx_eth_adjust_link(dev);2558 return ret;2559}2560 2561static int mv643xx_eth_change_mtu(struct net_device *dev, int new_mtu)2562{2563 struct mv643xx_eth_private *mp = netdev_priv(dev);2564 2565 WRITE_ONCE(dev->mtu, new_mtu);2566 mv643xx_eth_recalc_skb_size(mp);2567 tx_set_rate(mp, 1000000000, 16777216);2568 2569 if (!netif_running(dev))2570 return 0;2571 2572 /*2573 * Stop and then re-open the interface. This will allocate RX2574 * skbs of the new MTU.2575 * There is a possible danger that the open will not succeed,2576 * due to memory being full.2577 */2578 mv643xx_eth_stop(dev);2579 if (mv643xx_eth_open(dev)) {2580 netdev_err(dev,2581 "fatal error on re-opening device after MTU change\n");2582 }2583 2584 return 0;2585}2586 2587static void tx_timeout_task(struct work_struct *ugly)2588{2589 struct mv643xx_eth_private *mp;2590 2591 mp = container_of(ugly, struct mv643xx_eth_private, tx_timeout_task);2592 if (netif_running(mp->dev)) {2593 netif_tx_stop_all_queues(mp->dev);2594 port_reset(mp);2595 port_start(mp);2596 netif_tx_wake_all_queues(mp->dev);2597 }2598}2599 2600static void mv643xx_eth_tx_timeout(struct net_device *dev, unsigned int txqueue)2601{2602 struct mv643xx_eth_private *mp = netdev_priv(dev);2603 2604 netdev_info(dev, "tx timeout\n");2605 2606 schedule_work(&mp->tx_timeout_task);2607}2608 2609#ifdef CONFIG_NET_POLL_CONTROLLER2610static void mv643xx_eth_netpoll(struct net_device *dev)2611{2612 struct mv643xx_eth_private *mp = netdev_priv(dev);2613 2614 wrlp(mp, INT_MASK, 0x00000000);2615 rdlp(mp, INT_MASK);2616 2617 mv643xx_eth_irq(dev->irq, dev);2618 2619 wrlp(mp, INT_MASK, mp->int_mask);2620}2621#endif2622 2623 2624/* platform glue ************************************************************/2625static void2626mv643xx_eth_conf_mbus_windows(struct mv643xx_eth_shared_private *msp,2627 const struct mbus_dram_target_info *dram)2628{2629 void __iomem *base = msp->base;2630 u32 win_enable;2631 u32 win_protect;2632 int i;2633 2634 for (i = 0; i < 6; i++) {2635 writel(0, base + WINDOW_BASE(i));2636 writel(0, base + WINDOW_SIZE(i));2637 if (i < 4)2638 writel(0, base + WINDOW_REMAP_HIGH(i));2639 }2640 2641 win_enable = 0x3f;2642 win_protect = 0;2643 2644 for (i = 0; i < dram->num_cs; i++) {2645 const struct mbus_dram_window *cs = dram->cs + i;2646 2647 writel((cs->base & 0xffff0000) |2648 (cs->mbus_attr << 8) |2649 dram->mbus_dram_target_id, base + WINDOW_BASE(i));2650 writel((cs->size - 1) & 0xffff0000, base + WINDOW_SIZE(i));2651 2652 win_enable &= ~(1 << i);2653 win_protect |= 3 << (2 * i);2654 }2655 2656 writel(win_enable, base + WINDOW_BAR_ENABLE);2657 msp->win_protect = win_protect;2658}2659 2660static void infer_hw_params(struct mv643xx_eth_shared_private *msp)2661{2662 /*2663 * Check whether we have a 14-bit coal limit field in bits2664 * [21:8], or a 16-bit coal limit in bits [25,21:7] of the2665 * SDMA config register.2666 */2667 writel(0x02000000, msp->base + 0x0400 + SDMA_CONFIG);2668 if (readl(msp->base + 0x0400 + SDMA_CONFIG) & 0x02000000)2669 msp->extended_rx_coal_limit = 1;2670 else2671 msp->extended_rx_coal_limit = 0;2672 2673 /*2674 * Check whether the MAC supports TX rate control, and if2675 * yes, whether its associated registers are in the old or2676 * the new place.2677 */2678 writel(1, msp->base + 0x0400 + TX_BW_MTU_MOVED);2679 if (readl(msp->base + 0x0400 + TX_BW_MTU_MOVED) & 1) {2680 msp->tx_bw_control = TX_BW_CONTROL_NEW_LAYOUT;2681 } else {2682 writel(7, msp->base + 0x0400 + TX_BW_RATE);2683 if (readl(msp->base + 0x0400 + TX_BW_RATE) & 7)2684 msp->tx_bw_control = TX_BW_CONTROL_OLD_LAYOUT;2685 else2686 msp->tx_bw_control = TX_BW_CONTROL_ABSENT;2687 }2688}2689 2690#if defined(CONFIG_OF)2691static const struct of_device_id mv643xx_eth_shared_ids[] = {2692 { .compatible = "marvell,orion-eth", },2693 { .compatible = "marvell,kirkwood-eth", },2694 { }2695};2696MODULE_DEVICE_TABLE(of, mv643xx_eth_shared_ids);2697#endif2698 2699#ifdef CONFIG_OF_IRQ2700#define mv643xx_eth_property(_np, _name, _v) \2701 do { \2702 u32 tmp; \2703 if (!of_property_read_u32(_np, "marvell," _name, &tmp)) \2704 _v = tmp; \2705 } while (0)2706 2707static struct platform_device *port_platdev[3];2708 2709static void mv643xx_eth_shared_of_remove(void)2710{2711 int n;2712 2713 for (n = 0; n < 3; n++) {2714 platform_device_del(port_platdev[n]);2715 port_platdev[n] = NULL;2716 }2717}2718 2719static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,2720 struct device_node *pnp)2721{2722 struct platform_device *ppdev;2723 struct mv643xx_eth_platform_data ppd;2724 struct resource res;2725 int ret;2726 int dev_num = 0;2727 2728 memset(&ppd, 0, sizeof(ppd));2729 ppd.shared = pdev;2730 2731 memset(&res, 0, sizeof(res));2732 if (of_irq_to_resource(pnp, 0, &res) <= 0) {2733 dev_err(&pdev->dev, "missing interrupt on %pOFn\n", pnp);2734 return -EINVAL;2735 }2736 2737 if (of_property_read_u32(pnp, "reg", &ppd.port_number)) {2738 dev_err(&pdev->dev, "missing reg property on %pOFn\n", pnp);2739 return -EINVAL;2740 }2741 2742 if (ppd.port_number >= 3) {2743 dev_err(&pdev->dev, "invalid reg property on %pOFn\n", pnp);2744 return -EINVAL;2745 }2746 2747 while (dev_num < 3 && port_platdev[dev_num])2748 dev_num++;2749 2750 if (dev_num == 3) {2751 dev_err(&pdev->dev, "too many ports registered\n");2752 return -EINVAL;2753 }2754 2755 ret = of_get_mac_address(pnp, ppd.mac_addr);2756 if (ret == -EPROBE_DEFER)2757 return ret;2758 2759 mv643xx_eth_property(pnp, "tx-queue-size", ppd.tx_queue_size);2760 mv643xx_eth_property(pnp, "tx-sram-addr", ppd.tx_sram_addr);2761 mv643xx_eth_property(pnp, "tx-sram-size", ppd.tx_sram_size);2762 mv643xx_eth_property(pnp, "rx-queue-size", ppd.rx_queue_size);2763 mv643xx_eth_property(pnp, "rx-sram-addr", ppd.rx_sram_addr);2764 mv643xx_eth_property(pnp, "rx-sram-size", ppd.rx_sram_size);2765 2766 of_get_phy_mode(pnp, &ppd.interface);2767 2768 ppd.phy_node = of_parse_phandle(pnp, "phy-handle", 0);2769 if (!ppd.phy_node) {2770 ppd.phy_addr = MV643XX_ETH_PHY_NONE;2771 of_property_read_u32(pnp, "speed", &ppd.speed);2772 of_property_read_u32(pnp, "duplex", &ppd.duplex);2773 }2774 2775 ppdev = platform_device_alloc(MV643XX_ETH_NAME, dev_num);2776 if (!ppdev)2777 return -ENOMEM;2778 ppdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);2779 ppdev->dev.of_node = pnp;2780 2781 ret = platform_device_add_resources(ppdev, &res, 1);2782 if (ret)2783 goto port_err;2784 2785 ret = platform_device_add_data(ppdev, &ppd, sizeof(ppd));2786 if (ret)2787 goto port_err;2788 2789 ret = platform_device_add(ppdev);2790 if (ret)2791 goto port_err;2792 2793 port_platdev[dev_num] = ppdev;2794 2795 return 0;2796 2797port_err:2798 platform_device_put(ppdev);2799 return ret;2800}2801 2802static int mv643xx_eth_shared_of_probe(struct platform_device *pdev)2803{2804 struct mv643xx_eth_shared_platform_data *pd;2805 struct device_node *np = pdev->dev.of_node;2806 int ret;2807 2808 /* bail out if not registered from DT */2809 if (!np)2810 return 0;2811 2812 pd = devm_kzalloc(&pdev->dev, sizeof(*pd), GFP_KERNEL);2813 if (!pd)2814 return -ENOMEM;2815 pdev->dev.platform_data = pd;2816 2817 mv643xx_eth_property(np, "tx-checksum-limit", pd->tx_csum_limit);2818 2819 for_each_available_child_of_node_scoped(np, pnp) {2820 ret = mv643xx_eth_shared_of_add_port(pdev, pnp);2821 if (ret) {2822 mv643xx_eth_shared_of_remove();2823 return ret;2824 }2825 }2826 return 0;2827}2828 2829#else2830static inline int mv643xx_eth_shared_of_probe(struct platform_device *pdev)2831{2832 return 0;2833}2834 2835static inline void mv643xx_eth_shared_of_remove(void)2836{2837}2838#endif2839 2840static int mv643xx_eth_shared_probe(struct platform_device *pdev)2841{2842 static int mv643xx_eth_version_printed;2843 struct mv643xx_eth_shared_platform_data *pd;2844 struct mv643xx_eth_shared_private *msp;2845 const struct mbus_dram_target_info *dram;2846 struct resource *res;2847 int ret;2848 2849 if (!mv643xx_eth_version_printed++)2850 pr_notice("MV-643xx 10/100/1000 ethernet driver version %s\n",2851 mv643xx_eth_driver_version);2852 2853 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);2854 if (res == NULL)2855 return -EINVAL;2856 2857 msp = devm_kzalloc(&pdev->dev, sizeof(*msp), GFP_KERNEL);2858 if (msp == NULL)2859 return -ENOMEM;2860 platform_set_drvdata(pdev, msp);2861 2862 msp->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));2863 if (msp->base == NULL)2864 return -ENOMEM;2865 2866 msp->clk = devm_clk_get(&pdev->dev, NULL);2867 if (!IS_ERR(msp->clk))2868 clk_prepare_enable(msp->clk);2869 2870 /*2871 * (Re-)program MBUS remapping windows if we are asked to.2872 */2873 dram = mv_mbus_dram_info();2874 if (dram)2875 mv643xx_eth_conf_mbus_windows(msp, dram);2876 2877 ret = mv643xx_eth_shared_of_probe(pdev);2878 if (ret)2879 goto err_put_clk;2880 pd = dev_get_platdata(&pdev->dev);2881 2882 msp->tx_csum_limit = (pd != NULL && pd->tx_csum_limit) ?2883 pd->tx_csum_limit : 9 * 1024;2884 infer_hw_params(msp);2885 2886 return 0;2887 2888err_put_clk:2889 if (!IS_ERR(msp->clk))2890 clk_disable_unprepare(msp->clk);2891 return ret;2892}2893 2894static void mv643xx_eth_shared_remove(struct platform_device *pdev)2895{2896 struct mv643xx_eth_shared_private *msp = platform_get_drvdata(pdev);2897 2898 mv643xx_eth_shared_of_remove();2899 if (!IS_ERR(msp->clk))2900 clk_disable_unprepare(msp->clk);2901}2902 2903static struct platform_driver mv643xx_eth_shared_driver = {2904 .probe = mv643xx_eth_shared_probe,2905 .remove_new = mv643xx_eth_shared_remove,2906 .driver = {2907 .name = MV643XX_ETH_SHARED_NAME,2908 .of_match_table = of_match_ptr(mv643xx_eth_shared_ids),2909 },2910};2911 2912static void phy_addr_set(struct mv643xx_eth_private *mp, int phy_addr)2913{2914 int addr_shift = 5 * mp->port_num;2915 u32 data;2916 2917 data = rdl(mp, PHY_ADDR);2918 data &= ~(0x1f << addr_shift);2919 data |= (phy_addr & 0x1f) << addr_shift;2920 wrl(mp, PHY_ADDR, data);2921}2922 2923static int phy_addr_get(struct mv643xx_eth_private *mp)2924{2925 unsigned int data;2926 2927 data = rdl(mp, PHY_ADDR);2928 2929 return (data >> (5 * mp->port_num)) & 0x1f;2930}2931 2932static void set_params(struct mv643xx_eth_private *mp,2933 struct mv643xx_eth_platform_data *pd)2934{2935 struct net_device *dev = mp->dev;2936 unsigned int tx_ring_size;2937 2938 if (is_valid_ether_addr(pd->mac_addr)) {2939 eth_hw_addr_set(dev, pd->mac_addr);2940 } else {2941 u8 addr[ETH_ALEN];2942 2943 uc_addr_get(mp, addr);2944 eth_hw_addr_set(dev, addr);2945 }2946 2947 mp->rx_ring_size = DEFAULT_RX_QUEUE_SIZE;2948 if (pd->rx_queue_size)2949 mp->rx_ring_size = pd->rx_queue_size;2950 mp->rx_desc_sram_addr = pd->rx_sram_addr;2951 mp->rx_desc_sram_size = pd->rx_sram_size;2952 2953 mp->rxq_count = pd->rx_queue_count ? : 1;2954 2955 tx_ring_size = DEFAULT_TX_QUEUE_SIZE;2956 if (pd->tx_queue_size)2957 tx_ring_size = pd->tx_queue_size;2958 2959 mp->tx_ring_size = clamp_t(unsigned int, tx_ring_size,2960 MV643XX_MAX_SKB_DESCS * 2, 4096);2961 if (mp->tx_ring_size != tx_ring_size)2962 netdev_warn(dev, "TX queue size set to %u (requested %u)\n",2963 mp->tx_ring_size, tx_ring_size);2964 2965 mp->tx_desc_sram_addr = pd->tx_sram_addr;2966 mp->tx_desc_sram_size = pd->tx_sram_size;2967 2968 mp->txq_count = pd->tx_queue_count ? : 1;2969}2970 2971static int get_phy_mode(struct mv643xx_eth_private *mp)2972{2973 struct device *dev = mp->dev->dev.parent;2974 phy_interface_t iface;2975 int err;2976 2977 if (dev->of_node)2978 err = of_get_phy_mode(dev->of_node, &iface);2979 2980 /* Historical default if unspecified. We could also read/write2981 * the interface state in the PSC12982 */2983 if (!dev->of_node || err)2984 iface = PHY_INTERFACE_MODE_GMII;2985 return iface;2986}2987 2988static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,2989 int phy_addr)2990{2991 struct phy_device *phydev;2992 int start;2993 int num;2994 int i;2995 char phy_id[MII_BUS_ID_SIZE + 3];2996 2997 if (phy_addr == MV643XX_ETH_PHY_ADDR_DEFAULT) {2998 start = phy_addr_get(mp) & 0x1f;2999 num = 32;3000 } else {3001 start = phy_addr & 0x1f;3002 num = 1;3003 }3004 3005 /* Attempt to connect to the PHY using orion-mdio */3006 phydev = ERR_PTR(-ENODEV);3007 for (i = 0; i < num; i++) {3008 int addr = (start + i) & 0x1f;3009 3010 snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,3011 "orion-mdio-mii", addr);3012 3013 phydev = phy_connect(mp->dev, phy_id, mv643xx_eth_adjust_link,3014 get_phy_mode(mp));3015 if (!IS_ERR(phydev)) {3016 phy_addr_set(mp, addr);3017 break;3018 }3019 }3020 3021 return phydev;3022}3023 3024static void phy_init(struct mv643xx_eth_private *mp, int speed, int duplex)3025{3026 struct net_device *dev = mp->dev;3027 struct phy_device *phy = dev->phydev;3028 3029 if (speed == 0) {3030 phy->autoneg = AUTONEG_ENABLE;3031 phy->speed = 0;3032 phy->duplex = 0;3033 linkmode_copy(phy->advertising, phy->supported);3034 linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,3035 phy->advertising);3036 } else {3037 phy->autoneg = AUTONEG_DISABLE;3038 linkmode_zero(phy->advertising);3039 phy->speed = speed;3040 phy->duplex = duplex;3041 }3042 phy_start_aneg(phy);3043}3044 3045static void init_pscr(struct mv643xx_eth_private *mp, int speed, int duplex)3046{3047 struct net_device *dev = mp->dev;3048 u32 pscr;3049 3050 pscr = rdlp(mp, PORT_SERIAL_CONTROL);3051 if (pscr & SERIAL_PORT_ENABLE) {3052 pscr &= ~SERIAL_PORT_ENABLE;3053 wrlp(mp, PORT_SERIAL_CONTROL, pscr);3054 }3055 3056 pscr = MAX_RX_PACKET_9700BYTE | SERIAL_PORT_CONTROL_RESERVED;3057 if (!dev->phydev) {3058 pscr |= DISABLE_AUTO_NEG_SPEED_GMII;3059 if (speed == SPEED_1000)3060 pscr |= SET_GMII_SPEED_TO_1000;3061 else if (speed == SPEED_100)3062 pscr |= SET_MII_SPEED_TO_100;3063 3064 pscr |= DISABLE_AUTO_NEG_FOR_FLOW_CTRL;3065 3066 pscr |= DISABLE_AUTO_NEG_FOR_DUPLEX;3067 if (duplex == DUPLEX_FULL)3068 pscr |= SET_FULL_DUPLEX_MODE;3069 }3070 3071 wrlp(mp, PORT_SERIAL_CONTROL, pscr);3072}3073 3074static const struct net_device_ops mv643xx_eth_netdev_ops = {3075 .ndo_open = mv643xx_eth_open,3076 .ndo_stop = mv643xx_eth_stop,3077 .ndo_start_xmit = mv643xx_eth_xmit,3078 .ndo_set_rx_mode = mv643xx_eth_set_rx_mode,3079 .ndo_set_mac_address = mv643xx_eth_set_mac_address,3080 .ndo_validate_addr = eth_validate_addr,3081 .ndo_eth_ioctl = mv643xx_eth_ioctl,3082 .ndo_change_mtu = mv643xx_eth_change_mtu,3083 .ndo_set_features = mv643xx_eth_set_features,3084 .ndo_tx_timeout = mv643xx_eth_tx_timeout,3085 .ndo_get_stats = mv643xx_eth_get_stats,3086#ifdef CONFIG_NET_POLL_CONTROLLER3087 .ndo_poll_controller = mv643xx_eth_netpoll,3088#endif3089};3090 3091static int mv643xx_eth_probe(struct platform_device *pdev)3092{3093 struct mv643xx_eth_platform_data *pd;3094 struct mv643xx_eth_private *mp;3095 struct net_device *dev;3096 struct phy_device *phydev = NULL;3097 u32 psc1r;3098 int err, irq;3099 3100 pd = dev_get_platdata(&pdev->dev);3101 if (pd == NULL) {3102 dev_err(&pdev->dev, "no mv643xx_eth_platform_data\n");3103 return -ENODEV;3104 }3105 3106 if (pd->shared == NULL) {3107 dev_err(&pdev->dev, "no mv643xx_eth_platform_data->shared\n");3108 return -ENODEV;3109 }3110 3111 dev = alloc_etherdev_mq(sizeof(struct mv643xx_eth_private), 8);3112 if (!dev)3113 return -ENOMEM;3114 3115 SET_NETDEV_DEV(dev, &pdev->dev);3116 mp = netdev_priv(dev);3117 platform_set_drvdata(pdev, mp);3118 3119 mp->shared = platform_get_drvdata(pd->shared);3120 mp->base = mp->shared->base + 0x0400 + (pd->port_number << 10);3121 mp->port_num = pd->port_number;3122 3123 mp->dev = dev;3124 3125 if (of_device_is_compatible(pdev->dev.of_node,3126 "marvell,kirkwood-eth-port")) {3127 psc1r = rdlp(mp, PORT_SERIAL_CONTROL1);3128 3129 /* Kirkwood resets some registers on gated clocks. Especially3130 * CLK125_BYPASS_EN must be cleared but is not available on3131 * all other SoCs/System Controllers using this driver.3132 */3133 psc1r &= ~CLK125_BYPASS_EN;3134 3135 /* On Kirkwood with two Ethernet controllers, if both of them3136 * have RGMII_EN disabled, the first controller will be in GMII3137 * mode and the second one is effectively disabled, instead of3138 * two MII interfaces.3139 *3140 * To enable GMII in the first controller, the second one must3141 * also be configured (and may be enabled) with RGMII_EN3142 * disabled too, even though it cannot be used at all.3143 */3144 switch (pd->interface) {3145 /* Use internal to denote second controller being disabled */3146 case PHY_INTERFACE_MODE_INTERNAL:3147 case PHY_INTERFACE_MODE_MII:3148 case PHY_INTERFACE_MODE_GMII:3149 psc1r &= ~RGMII_EN;3150 break;3151 case PHY_INTERFACE_MODE_RGMII:3152 case PHY_INTERFACE_MODE_RGMII_ID:3153 case PHY_INTERFACE_MODE_RGMII_RXID:3154 case PHY_INTERFACE_MODE_RGMII_TXID:3155 psc1r |= RGMII_EN;3156 break;3157 default:3158 /* Unknown; don't touch */3159 break;3160 }3161 3162 wrlp(mp, PORT_SERIAL_CONTROL1, psc1r);3163 }3164 3165 /*3166 * Start with a default rate, and if there is a clock, allow3167 * it to override the default.3168 */3169 mp->t_clk = 133000000;3170 mp->clk = devm_clk_get(&pdev->dev, NULL);3171 if (!IS_ERR(mp->clk)) {3172 clk_prepare_enable(mp->clk);3173 mp->t_clk = clk_get_rate(mp->clk);3174 } else if (!IS_ERR(mp->shared->clk)) {3175 mp->t_clk = clk_get_rate(mp->shared->clk);3176 }3177 3178 set_params(mp, pd);3179 netif_set_real_num_tx_queues(dev, mp->txq_count);3180 netif_set_real_num_rx_queues(dev, mp->rxq_count);3181 3182 err = 0;3183 if (pd->phy_node) {3184 phydev = of_phy_connect(mp->dev, pd->phy_node,3185 mv643xx_eth_adjust_link, 0,3186 get_phy_mode(mp));3187 if (!phydev)3188 err = -ENODEV;3189 else3190 phy_addr_set(mp, phydev->mdio.addr);3191 } else if (pd->phy_addr != MV643XX_ETH_PHY_NONE) {3192 phydev = phy_scan(mp, pd->phy_addr);3193 3194 if (IS_ERR(phydev))3195 err = PTR_ERR(phydev);3196 else3197 phy_init(mp, pd->speed, pd->duplex);3198 }3199 if (err == -ENODEV) {3200 err = -EPROBE_DEFER;3201 goto out;3202 }3203 if (err)3204 goto out;3205 3206 dev->ethtool_ops = &mv643xx_eth_ethtool_ops;3207 3208 init_pscr(mp, pd->speed, pd->duplex);3209 3210 3211 mib_counters_clear(mp);3212 3213 timer_setup(&mp->mib_counters_timer, mib_counters_timer_wrapper, 0);3214 mp->mib_counters_timer.expires = jiffies + 30 * HZ;3215 3216 spin_lock_init(&mp->mib_counters_lock);3217 3218 INIT_WORK(&mp->tx_timeout_task, tx_timeout_task);3219 3220 netif_napi_add(dev, &mp->napi, mv643xx_eth_poll);3221 3222 timer_setup(&mp->rx_oom, oom_timer_wrapper, 0);3223 3224 3225 irq = platform_get_irq(pdev, 0);3226 if (WARN_ON(irq < 0)) {3227 err = irq;3228 goto out;3229 }3230 dev->irq = irq;3231 3232 dev->netdev_ops = &mv643xx_eth_netdev_ops;3233 3234 dev->watchdog_timeo = 2 * HZ;3235 dev->base_addr = 0;3236 3237 dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;3238 dev->vlan_features = dev->features;3239 3240 dev->features |= NETIF_F_RXCSUM;3241 dev->hw_features = dev->features;3242 3243 dev->priv_flags |= IFF_UNICAST_FLT;3244 netif_set_tso_max_segs(dev, MV643XX_MAX_TSO_SEGS);3245 3246 /* MTU range: 64 - 9500 */3247 dev->min_mtu = 64;3248 dev->max_mtu = 9500;3249 3250 if (mp->shared->win_protect)3251 wrl(mp, WINDOW_PROTECT(mp->port_num), mp->shared->win_protect);3252 3253 netif_carrier_off(dev);3254 3255 wrlp(mp, SDMA_CONFIG, PORT_SDMA_CONFIG_DEFAULT_VALUE);3256 3257 set_rx_coal(mp, 250);3258 set_tx_coal(mp, 0);3259 3260 err = register_netdev(dev);3261 if (err)3262 goto out;3263 3264 netdev_notice(dev, "port %d with MAC address %pM\n",3265 mp->port_num, dev->dev_addr);3266 3267 if (mp->tx_desc_sram_size > 0)3268 netdev_notice(dev, "configured with sram\n");3269 3270 return 0;3271 3272out:3273 if (!IS_ERR(mp->clk))3274 clk_disable_unprepare(mp->clk);3275 free_netdev(dev);3276 3277 return err;3278}3279 3280static void mv643xx_eth_remove(struct platform_device *pdev)3281{3282 struct mv643xx_eth_private *mp = platform_get_drvdata(pdev);3283 struct net_device *dev = mp->dev;3284 3285 unregister_netdev(mp->dev);3286 if (dev->phydev)3287 phy_disconnect(dev->phydev);3288 cancel_work_sync(&mp->tx_timeout_task);3289 3290 if (!IS_ERR(mp->clk))3291 clk_disable_unprepare(mp->clk);3292 3293 free_netdev(mp->dev);3294}3295 3296static void mv643xx_eth_shutdown(struct platform_device *pdev)3297{3298 struct mv643xx_eth_private *mp = platform_get_drvdata(pdev);3299 3300 /* Mask all interrupts on ethernet port */3301 wrlp(mp, INT_MASK, 0);3302 rdlp(mp, INT_MASK);3303 3304 if (netif_running(mp->dev))3305 port_reset(mp);3306}3307 3308static struct platform_driver mv643xx_eth_driver = {3309 .probe = mv643xx_eth_probe,3310 .remove_new = mv643xx_eth_remove,3311 .shutdown = mv643xx_eth_shutdown,3312 .driver = {3313 .name = MV643XX_ETH_NAME,3314 },3315};3316 3317static struct platform_driver * const drivers[] = {3318 &mv643xx_eth_shared_driver,3319 &mv643xx_eth_driver,3320};3321 3322static int __init mv643xx_eth_init_module(void)3323{3324 return platform_register_drivers(drivers, ARRAY_SIZE(drivers));3325}3326module_init(mv643xx_eth_init_module);3327 3328static void __exit mv643xx_eth_cleanup_module(void)3329{3330 platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));3331}3332module_exit(mv643xx_eth_cleanup_module);3333 3334MODULE_AUTHOR("Rabeeh Khoury, Assaf Hoffman, Matthew Dharm, "3335 "Manish Lachwani, Dale Farnsworth and Lennert Buytenhek");3336MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX");3337MODULE_LICENSE("GPL");3338MODULE_ALIAS("platform:" MV643XX_ETH_SHARED_NAME);3339MODULE_ALIAS("platform:" MV643XX_ETH_NAME);3340