brintos

brintos / linux-shallow public Read only

0
0
Text · 31.8 KiB · ddd87ef Raw
1260 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * ks8842.c timberdale KS8842 ethernet driver4 * Copyright (c) 2009 Intel Corporation5 */6 7/* Supports:8 * The Micrel KS8842 behind the timberdale FPGA9 * The genuine Micrel KS8841/42 device with ISA 16/32bit bus interface10 */11 12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt13 14#include <linux/interrupt.h>15#include <linux/kernel.h>16#include <linux/module.h>17#include <linux/platform_device.h>18#include <linux/netdevice.h>19#include <linux/etherdevice.h>20#include <linux/ethtool.h>21#include <linux/ks8842.h>22#include <linux/dmaengine.h>23#include <linux/dma-mapping.h>24#include <linux/scatterlist.h>25 26#define DRV_NAME "ks8842"27 28/* Timberdale specific Registers */29#define REG_TIMB_RST		0x1c30#define REG_TIMB_FIFO		0x2031#define REG_TIMB_ISR		0x2432#define REG_TIMB_IER		0x2833#define REG_TIMB_IAR		0x2C34#define REQ_TIMB_DMA_RESUME	0x3035 36/* KS8842 registers */37 38#define REG_SELECT_BANK 0x0e39 40/* bank 0 registers */41#define REG_QRFCR	0x0442 43/* bank 2 registers */44#define REG_MARL	0x0045#define REG_MARM	0x0246#define REG_MARH	0x0447 48/* bank 3 registers */49#define REG_GRR		0x0650 51/* bank 16 registers */52#define REG_TXCR	0x0053#define REG_TXSR	0x0254#define REG_RXCR	0x0455#define REG_TXMIR	0x0856#define REG_RXMIR	0x0A57 58/* bank 17 registers */59#define REG_TXQCR	0x0060#define REG_RXQCR	0x0261#define REG_TXFDPR	0x0462#define REG_RXFDPR	0x0663#define REG_QMU_DATA_LO 0x0864#define REG_QMU_DATA_HI 0x0A65 66/* bank 18 registers */67#define REG_IER		0x0068#define IRQ_LINK_CHANGE	0x800069#define IRQ_TX		0x400070#define IRQ_RX		0x200071#define IRQ_RX_OVERRUN	0x080072#define IRQ_TX_STOPPED	0x020073#define IRQ_RX_STOPPED	0x010074#define IRQ_RX_ERROR	0x008075#define ENABLED_IRQS	(IRQ_LINK_CHANGE | IRQ_TX | IRQ_RX | IRQ_RX_STOPPED | \76		IRQ_TX_STOPPED | IRQ_RX_OVERRUN | IRQ_RX_ERROR)77/* When running via timberdale in DMA mode, the RX interrupt should be78   enabled in the KS8842, but not in the FPGA IP, since the IP handles79   RX DMA internally.80   TX interrupts are not needed it is handled by the FPGA the driver is81   notified via DMA callbacks.82*/83#define ENABLED_IRQS_DMA_IP	(IRQ_LINK_CHANGE | IRQ_RX_STOPPED | \84	IRQ_TX_STOPPED | IRQ_RX_OVERRUN | IRQ_RX_ERROR)85#define ENABLED_IRQS_DMA	(ENABLED_IRQS_DMA_IP | IRQ_RX)86#define REG_ISR		0x0287#define REG_RXSR	0x0488#define RXSR_VALID	0x800089#define RXSR_BROADCAST	0x8090#define RXSR_MULTICAST	0x4091#define RXSR_UNICAST	0x2092#define RXSR_FRAMETYPE	0x0893#define RXSR_TOO_LONG	0x0494#define RXSR_RUNT	0x0295#define RXSR_CRC_ERROR	0x0196#define RXSR_ERROR	(RXSR_TOO_LONG | RXSR_RUNT | RXSR_CRC_ERROR)97 98/* bank 32 registers */99#define REG_SW_ID_AND_ENABLE	0x00100#define REG_SGCR1		0x02101#define REG_SGCR2		0x04102#define REG_SGCR3		0x06103 104/* bank 39 registers */105#define REG_MACAR1		0x00106#define REG_MACAR2		0x02107#define REG_MACAR3		0x04108 109/* bank 45 registers */110#define REG_P1MBCR		0x00111#define REG_P1MBSR		0x02112 113/* bank 46 registers */114#define REG_P2MBCR		0x00115#define REG_P2MBSR		0x02116 117/* bank 48 registers */118#define REG_P1CR2		0x02119 120/* bank 49 registers */121#define REG_P1CR4		0x02122#define REG_P1SR		0x04123 124/* flags passed by platform_device for configuration */125#define	MICREL_KS884X		0x01	/* 0=Timeberdale(FPGA), 1=Micrel */126#define	KS884X_16BIT		0x02	/*  1=16bit, 0=32bit */127 128#define DMA_BUFFER_SIZE		2048129 130struct ks8842_tx_dma_ctl {131	struct dma_chan *chan;132	struct dma_async_tx_descriptor *adesc;133	void *buf;134	struct scatterlist sg;135	int channel;136};137 138struct ks8842_rx_dma_ctl {139	struct dma_chan *chan;140	struct dma_async_tx_descriptor *adesc;141	struct sk_buff  *skb;142	struct scatterlist sg;143	struct tasklet_struct tasklet;144	int channel;145};146 147#define KS8842_USE_DMA(adapter) (((adapter)->dma_tx.channel != -1) && \148	 ((adapter)->dma_rx.channel != -1))149 150struct ks8842_adapter {151	void __iomem	*hw_addr;152	int		irq;153	unsigned long	conf_flags;	/* copy of platform_device config */154	struct tasklet_struct	tasklet;155	spinlock_t	lock; /* spinlock to be interrupt safe */156	struct work_struct timeout_work;157	struct net_device *netdev;158	struct device *dev;159	struct ks8842_tx_dma_ctl	dma_tx;160	struct ks8842_rx_dma_ctl	dma_rx;161};162 163static void ks8842_dma_rx_cb(void *data);164static void ks8842_dma_tx_cb(void *data);165 166static inline void ks8842_resume_dma(struct ks8842_adapter *adapter)167{168	iowrite32(1, adapter->hw_addr + REQ_TIMB_DMA_RESUME);169}170 171static inline void ks8842_select_bank(struct ks8842_adapter *adapter, u16 bank)172{173	iowrite16(bank, adapter->hw_addr + REG_SELECT_BANK);174}175 176static inline void ks8842_write8(struct ks8842_adapter *adapter, u16 bank,177	u8 value, int offset)178{179	ks8842_select_bank(adapter, bank);180	iowrite8(value, adapter->hw_addr + offset);181}182 183static inline void ks8842_write16(struct ks8842_adapter *adapter, u16 bank,184	u16 value, int offset)185{186	ks8842_select_bank(adapter, bank);187	iowrite16(value, adapter->hw_addr + offset);188}189 190static inline void ks8842_enable_bits(struct ks8842_adapter *adapter, u16 bank,191	u16 bits, int offset)192{193	u16 reg;194	ks8842_select_bank(adapter, bank);195	reg = ioread16(adapter->hw_addr + offset);196	reg |= bits;197	iowrite16(reg, adapter->hw_addr + offset);198}199 200static inline void ks8842_clear_bits(struct ks8842_adapter *adapter, u16 bank,201	u16 bits, int offset)202{203	u16 reg;204	ks8842_select_bank(adapter, bank);205	reg = ioread16(adapter->hw_addr + offset);206	reg &= ~bits;207	iowrite16(reg, adapter->hw_addr + offset);208}209 210static inline void ks8842_write32(struct ks8842_adapter *adapter, u16 bank,211	u32 value, int offset)212{213	ks8842_select_bank(adapter, bank);214	iowrite32(value, adapter->hw_addr + offset);215}216 217static inline u8 ks8842_read8(struct ks8842_adapter *adapter, u16 bank,218	int offset)219{220	ks8842_select_bank(adapter, bank);221	return ioread8(adapter->hw_addr + offset);222}223 224static inline u16 ks8842_read16(struct ks8842_adapter *adapter, u16 bank,225	int offset)226{227	ks8842_select_bank(adapter, bank);228	return ioread16(adapter->hw_addr + offset);229}230 231static inline u32 ks8842_read32(struct ks8842_adapter *adapter, u16 bank,232	int offset)233{234	ks8842_select_bank(adapter, bank);235	return ioread32(adapter->hw_addr + offset);236}237 238static void ks8842_reset(struct ks8842_adapter *adapter)239{240	if (adapter->conf_flags & MICREL_KS884X) {241		ks8842_write16(adapter, 3, 1, REG_GRR);242		msleep(10);243		iowrite16(0, adapter->hw_addr + REG_GRR);244	} else {245		/* The KS8842 goes haywire when doing softare reset246		* a work around in the timberdale IP is implemented to247		* do a hardware reset instead248		ks8842_write16(adapter, 3, 1, REG_GRR);249		msleep(10);250		iowrite16(0, adapter->hw_addr + REG_GRR);251		*/252		iowrite32(0x1, adapter->hw_addr + REG_TIMB_RST);253		msleep(20);254	}255}256 257static void ks8842_update_link_status(struct net_device *netdev,258	struct ks8842_adapter *adapter)259{260	/* check the status of the link */261	if (ks8842_read16(adapter, 45, REG_P1MBSR) & 0x4) {262		netif_carrier_on(netdev);263		netif_wake_queue(netdev);264	} else {265		netif_stop_queue(netdev);266		netif_carrier_off(netdev);267	}268}269 270static void ks8842_enable_tx(struct ks8842_adapter *adapter)271{272	ks8842_enable_bits(adapter, 16, 0x01, REG_TXCR);273}274 275static void ks8842_disable_tx(struct ks8842_adapter *adapter)276{277	ks8842_clear_bits(adapter, 16, 0x01, REG_TXCR);278}279 280static void ks8842_enable_rx(struct ks8842_adapter *adapter)281{282	ks8842_enable_bits(adapter, 16, 0x01, REG_RXCR);283}284 285static void ks8842_disable_rx(struct ks8842_adapter *adapter)286{287	ks8842_clear_bits(adapter, 16, 0x01, REG_RXCR);288}289 290static void ks8842_reset_hw(struct ks8842_adapter *adapter)291{292	/* reset the HW */293	ks8842_reset(adapter);294 295	/* Enable QMU Transmit flow control / transmit padding / Transmit CRC */296	ks8842_write16(adapter, 16, 0x000E, REG_TXCR);297 298	/* enable the receiver, uni + multi + broadcast + flow ctrl299		+ crc strip */300	ks8842_write16(adapter, 16, 0x8 | 0x20 | 0x40 | 0x80 | 0x400,301		REG_RXCR);302 303	/* TX frame pointer autoincrement */304	ks8842_write16(adapter, 17, 0x4000, REG_TXFDPR);305 306	/* RX frame pointer autoincrement */307	ks8842_write16(adapter, 17, 0x4000, REG_RXFDPR);308 309	/* RX 2 kb high watermark */310	ks8842_write16(adapter, 0, 0x1000, REG_QRFCR);311 312	/* aggressive back off in half duplex */313	ks8842_enable_bits(adapter, 32, 1 << 8, REG_SGCR1);314 315	/* enable no excessive collison drop */316	ks8842_enable_bits(adapter, 32, 1 << 3, REG_SGCR2);317 318	/* Enable port 1 force flow control / back pressure / transmit / recv */319	ks8842_write16(adapter, 48, 0x1E07, REG_P1CR2);320 321	/* restart port auto-negotiation */322	ks8842_enable_bits(adapter, 49, 1 << 13, REG_P1CR4);323 324	/* Enable the transmitter */325	ks8842_enable_tx(adapter);326 327	/* Enable the receiver */328	ks8842_enable_rx(adapter);329 330	/* clear all interrupts */331	ks8842_write16(adapter, 18, 0xffff, REG_ISR);332 333	/* enable interrupts */334	if (KS8842_USE_DMA(adapter)) {335		/* When running in DMA Mode the RX interrupt is not enabled in336		   timberdale because RX data is received by DMA callbacks337		   it must still be enabled in the KS8842 because it indicates338		   to timberdale when there is RX data for it's DMA FIFOs */339		iowrite16(ENABLED_IRQS_DMA_IP, adapter->hw_addr + REG_TIMB_IER);340		ks8842_write16(adapter, 18, ENABLED_IRQS_DMA, REG_IER);341	} else {342		if (!(adapter->conf_flags & MICREL_KS884X))343			iowrite16(ENABLED_IRQS,344				adapter->hw_addr + REG_TIMB_IER);345		ks8842_write16(adapter, 18, ENABLED_IRQS, REG_IER);346	}347	/* enable the switch */348	ks8842_write16(adapter, 32, 0x1, REG_SW_ID_AND_ENABLE);349}350 351static void ks8842_init_mac_addr(struct ks8842_adapter *adapter)352{353	u8 addr[ETH_ALEN];354	int i;355	u16 mac;356 357	for (i = 0; i < ETH_ALEN; i++)358		addr[ETH_ALEN - i - 1] = ks8842_read8(adapter, 2, REG_MARL + i);359	eth_hw_addr_set(adapter->netdev, addr);360 361	if (adapter->conf_flags & MICREL_KS884X) {362		/*363		the sequence of saving mac addr between MAC and Switch is364		different.365		*/366 367		mac = ks8842_read16(adapter, 2, REG_MARL);368		ks8842_write16(adapter, 39, mac, REG_MACAR3);369		mac = ks8842_read16(adapter, 2, REG_MARM);370		ks8842_write16(adapter, 39, mac, REG_MACAR2);371		mac = ks8842_read16(adapter, 2, REG_MARH);372		ks8842_write16(adapter, 39, mac, REG_MACAR1);373	} else {374 375		/* make sure the switch port uses the same MAC as the QMU */376		mac = ks8842_read16(adapter, 2, REG_MARL);377		ks8842_write16(adapter, 39, mac, REG_MACAR1);378		mac = ks8842_read16(adapter, 2, REG_MARM);379		ks8842_write16(adapter, 39, mac, REG_MACAR2);380		mac = ks8842_read16(adapter, 2, REG_MARH);381		ks8842_write16(adapter, 39, mac, REG_MACAR3);382	}383}384 385static void ks8842_write_mac_addr(struct ks8842_adapter *adapter, const u8 *mac)386{387	unsigned long flags;388	unsigned i;389 390	spin_lock_irqsave(&adapter->lock, flags);391	for (i = 0; i < ETH_ALEN; i++) {392		ks8842_write8(adapter, 2, mac[ETH_ALEN - i - 1], REG_MARL + i);393		if (!(adapter->conf_flags & MICREL_KS884X))394			ks8842_write8(adapter, 39, mac[ETH_ALEN - i - 1],395				REG_MACAR1 + i);396	}397 398	if (adapter->conf_flags & MICREL_KS884X) {399		/*400		the sequence of saving mac addr between MAC and Switch is401		different.402		*/403 404		u16 mac;405 406		mac = ks8842_read16(adapter, 2, REG_MARL);407		ks8842_write16(adapter, 39, mac, REG_MACAR3);408		mac = ks8842_read16(adapter, 2, REG_MARM);409		ks8842_write16(adapter, 39, mac, REG_MACAR2);410		mac = ks8842_read16(adapter, 2, REG_MARH);411		ks8842_write16(adapter, 39, mac, REG_MACAR1);412	}413	spin_unlock_irqrestore(&adapter->lock, flags);414}415 416static inline u16 ks8842_tx_fifo_space(struct ks8842_adapter *adapter)417{418	return ks8842_read16(adapter, 16, REG_TXMIR) & 0x1fff;419}420 421static int ks8842_tx_frame_dma(struct sk_buff *skb, struct net_device *netdev)422{423	struct ks8842_adapter *adapter = netdev_priv(netdev);424	struct ks8842_tx_dma_ctl *ctl = &adapter->dma_tx;425	u8 *buf = ctl->buf;426 427	if (ctl->adesc) {428		netdev_dbg(netdev, "%s: TX ongoing\n", __func__);429		/* transfer ongoing */430		return NETDEV_TX_BUSY;431	}432 433	sg_dma_len(&ctl->sg) = skb->len + sizeof(u32);434 435	/* copy data to the TX buffer */436	/* the control word, enable IRQ, port 1 and the length */437	*buf++ = 0x00;438	*buf++ = 0x01; /* Port 1 */439	*buf++ = skb->len & 0xff;440	*buf++ = (skb->len >> 8) & 0xff;441	skb_copy_from_linear_data(skb, buf, skb->len);442 443	dma_sync_single_range_for_device(adapter->dev,444		sg_dma_address(&ctl->sg), 0, sg_dma_len(&ctl->sg),445		DMA_TO_DEVICE);446 447	/* make sure the length is a multiple of 4 */448	if (sg_dma_len(&ctl->sg) % 4)449		sg_dma_len(&ctl->sg) += 4 - sg_dma_len(&ctl->sg) % 4;450 451	ctl->adesc = dmaengine_prep_slave_sg(ctl->chan,452		&ctl->sg, 1, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT);453	if (!ctl->adesc)454		return NETDEV_TX_BUSY;455 456	ctl->adesc->callback_param = netdev;457	ctl->adesc->callback = ks8842_dma_tx_cb;458	ctl->adesc->tx_submit(ctl->adesc);459 460	netdev->stats.tx_bytes += skb->len;461 462	dev_kfree_skb(skb);463 464	return NETDEV_TX_OK;465}466 467static int ks8842_tx_frame(struct sk_buff *skb, struct net_device *netdev)468{469	struct ks8842_adapter *adapter = netdev_priv(netdev);470	int len = skb->len;471 472	netdev_dbg(netdev, "%s: len %u head %p data %p tail %p end %p\n",473		__func__, skb->len, skb->head, skb->data,474		skb_tail_pointer(skb), skb_end_pointer(skb));475 476	/* check FIFO buffer space, we need space for CRC and command bits */477	if (ks8842_tx_fifo_space(adapter) < len + 8)478		return NETDEV_TX_BUSY;479 480	if (adapter->conf_flags & KS884X_16BIT) {481		u16 *ptr16 = (u16 *)skb->data;482		ks8842_write16(adapter, 17, 0x8000 | 0x100, REG_QMU_DATA_LO);483		ks8842_write16(adapter, 17, (u16)len, REG_QMU_DATA_HI);484		netdev->stats.tx_bytes += len;485 486		/* copy buffer */487		while (len > 0) {488			iowrite16(*ptr16++, adapter->hw_addr + REG_QMU_DATA_LO);489			iowrite16(*ptr16++, adapter->hw_addr + REG_QMU_DATA_HI);490			len -= sizeof(u32);491		}492	} else {493 494		u32 *ptr = (u32 *)skb->data;495		u32 ctrl;496		/* the control word, enable IRQ, port 1 and the length */497		ctrl = 0x8000 | 0x100 | (len << 16);498		ks8842_write32(adapter, 17, ctrl, REG_QMU_DATA_LO);499 500		netdev->stats.tx_bytes += len;501 502		/* copy buffer */503		while (len > 0) {504			iowrite32(*ptr, adapter->hw_addr + REG_QMU_DATA_LO);505			len -= sizeof(u32);506			ptr++;507		}508	}509 510	/* enqueue packet */511	ks8842_write16(adapter, 17, 1, REG_TXQCR);512 513	dev_kfree_skb(skb);514 515	return NETDEV_TX_OK;516}517 518static void ks8842_update_rx_err_counters(struct net_device *netdev, u32 status)519{520	netdev_dbg(netdev, "RX error, status: %x\n", status);521 522	netdev->stats.rx_errors++;523	if (status & RXSR_TOO_LONG)524		netdev->stats.rx_length_errors++;525	if (status & RXSR_CRC_ERROR)526		netdev->stats.rx_crc_errors++;527	if (status & RXSR_RUNT)528		netdev->stats.rx_frame_errors++;529}530 531static void ks8842_update_rx_counters(struct net_device *netdev, u32 status,532	int len)533{534	netdev_dbg(netdev, "RX packet, len: %d\n", len);535 536	netdev->stats.rx_packets++;537	netdev->stats.rx_bytes += len;538	if (status & RXSR_MULTICAST)539		netdev->stats.multicast++;540}541 542static int __ks8842_start_new_rx_dma(struct net_device *netdev)543{544	struct ks8842_adapter *adapter = netdev_priv(netdev);545	struct ks8842_rx_dma_ctl *ctl = &adapter->dma_rx;546	struct scatterlist *sg = &ctl->sg;547	int err;548 549	ctl->skb = netdev_alloc_skb(netdev, DMA_BUFFER_SIZE);550	if (ctl->skb) {551		sg_init_table(sg, 1);552		sg_dma_address(sg) = dma_map_single(adapter->dev,553			ctl->skb->data, DMA_BUFFER_SIZE, DMA_FROM_DEVICE);554		if (dma_mapping_error(adapter->dev, sg_dma_address(sg))) {555			err = -ENOMEM;556			sg_dma_address(sg) = 0;557			goto out;558		}559 560		sg_dma_len(sg) = DMA_BUFFER_SIZE;561 562		ctl->adesc = dmaengine_prep_slave_sg(ctl->chan,563			sg, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);564 565		if (!ctl->adesc) {566			err = -ENOMEM;567			goto out;568		}569 570		ctl->adesc->callback_param = netdev;571		ctl->adesc->callback = ks8842_dma_rx_cb;572		ctl->adesc->tx_submit(ctl->adesc);573	} else {574		err = -ENOMEM;575		sg_dma_address(sg) = 0;576		goto out;577	}578 579	return 0;580out:581	if (sg_dma_address(sg))582		dma_unmap_single(adapter->dev, sg_dma_address(sg),583			DMA_BUFFER_SIZE, DMA_FROM_DEVICE);584	sg_dma_address(sg) = 0;585	dev_kfree_skb(ctl->skb);586	ctl->skb = NULL;587 588	printk(KERN_ERR DRV_NAME": Failed to start RX DMA: %d\n", err);589	return err;590}591 592static void ks8842_rx_frame_dma_tasklet(struct tasklet_struct *t)593{594	struct ks8842_adapter *adapter = from_tasklet(adapter, t, dma_rx.tasklet);595	struct net_device *netdev = adapter->netdev;596	struct ks8842_rx_dma_ctl *ctl = &adapter->dma_rx;597	struct sk_buff *skb = ctl->skb;598	dma_addr_t addr = sg_dma_address(&ctl->sg);599	u32 status;600 601	ctl->adesc = NULL;602 603	/* kick next transfer going */604	__ks8842_start_new_rx_dma(netdev);605 606	/* now handle the data we got */607	dma_unmap_single(adapter->dev, addr, DMA_BUFFER_SIZE, DMA_FROM_DEVICE);608 609	status = *((u32 *)skb->data);610 611	netdev_dbg(netdev, "%s - rx_data: status: %x\n",612		__func__, status & 0xffff);613 614	/* check the status */615	if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {616		int len = (status >> 16) & 0x7ff;617 618		ks8842_update_rx_counters(netdev, status, len);619 620		/* reserve 4 bytes which is the status word */621		skb_reserve(skb, 4);622		skb_put(skb, len);623 624		skb->protocol = eth_type_trans(skb, netdev);625		netif_rx(skb);626	} else {627		ks8842_update_rx_err_counters(netdev, status);628		dev_kfree_skb(skb);629	}630}631 632static void ks8842_rx_frame(struct net_device *netdev,633	struct ks8842_adapter *adapter)634{635	u32 status;636	int len;637 638	if (adapter->conf_flags & KS884X_16BIT) {639		status = ks8842_read16(adapter, 17, REG_QMU_DATA_LO);640		len = ks8842_read16(adapter, 17, REG_QMU_DATA_HI);641		netdev_dbg(netdev, "%s - rx_data: status: %x\n",642			   __func__, status);643	} else {644		status = ks8842_read32(adapter, 17, REG_QMU_DATA_LO);645		len = (status >> 16) & 0x7ff;646		status &= 0xffff;647		netdev_dbg(netdev, "%s - rx_data: status: %x\n",648			   __func__, status);649	}650 651	/* check the status */652	if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {653		struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len + 3);654 655		if (skb) {656 657			ks8842_update_rx_counters(netdev, status, len);658 659			if (adapter->conf_flags & KS884X_16BIT) {660				u16 *data16 = skb_put(skb, len);661				ks8842_select_bank(adapter, 17);662				while (len > 0) {663					*data16++ = ioread16(adapter->hw_addr +664						REG_QMU_DATA_LO);665					*data16++ = ioread16(adapter->hw_addr +666						REG_QMU_DATA_HI);667					len -= sizeof(u32);668				}669			} else {670				u32 *data = skb_put(skb, len);671 672				ks8842_select_bank(adapter, 17);673				while (len > 0) {674					*data++ = ioread32(adapter->hw_addr +675						REG_QMU_DATA_LO);676					len -= sizeof(u32);677				}678			}679			skb->protocol = eth_type_trans(skb, netdev);680			netif_rx(skb);681		} else682			netdev->stats.rx_dropped++;683	} else684		ks8842_update_rx_err_counters(netdev, status);685 686	/* set high watermark to 3K */687	ks8842_clear_bits(adapter, 0, 1 << 12, REG_QRFCR);688 689	/* release the frame */690	ks8842_write16(adapter, 17, 0x01, REG_RXQCR);691 692	/* set high watermark to 2K */693	ks8842_enable_bits(adapter, 0, 1 << 12, REG_QRFCR);694}695 696static void ks8842_handle_rx(struct net_device *netdev,697	struct ks8842_adapter *adapter)698{699	u16 rx_data = ks8842_read16(adapter, 16, REG_RXMIR) & 0x1fff;700	netdev_dbg(netdev, "%s Entry - rx_data: %d\n", __func__, rx_data);701	while (rx_data) {702		ks8842_rx_frame(netdev, adapter);703		rx_data = ks8842_read16(adapter, 16, REG_RXMIR) & 0x1fff;704	}705}706 707static void ks8842_handle_tx(struct net_device *netdev,708	struct ks8842_adapter *adapter)709{710	u16 sr = ks8842_read16(adapter, 16, REG_TXSR);711	netdev_dbg(netdev, "%s - entry, sr: %x\n", __func__, sr);712	netdev->stats.tx_packets++;713	if (netif_queue_stopped(netdev))714		netif_wake_queue(netdev);715}716 717static void ks8842_handle_rx_overrun(struct net_device *netdev,718	struct ks8842_adapter *adapter)719{720	netdev_dbg(netdev, "%s: entry\n", __func__);721	netdev->stats.rx_errors++;722	netdev->stats.rx_fifo_errors++;723}724 725static void ks8842_tasklet(struct tasklet_struct *t)726{727	struct ks8842_adapter *adapter = from_tasklet(adapter, t, tasklet);728	struct net_device *netdev = adapter->netdev;729	u16 isr;730	unsigned long flags;731	u16 entry_bank;732 733	/* read current bank to be able to set it back */734	spin_lock_irqsave(&adapter->lock, flags);735	entry_bank = ioread16(adapter->hw_addr + REG_SELECT_BANK);736	spin_unlock_irqrestore(&adapter->lock, flags);737 738	isr = ks8842_read16(adapter, 18, REG_ISR);739	netdev_dbg(netdev, "%s - ISR: 0x%x\n", __func__, isr);740 741	/* when running in DMA mode, do not ack RX interrupts, it is handled742	   internally by timberdale, otherwise it's DMA FIFO:s would stop743	*/744	if (KS8842_USE_DMA(adapter))745		isr &= ~IRQ_RX;746 747	/* Ack */748	ks8842_write16(adapter, 18, isr, REG_ISR);749 750	if (!(adapter->conf_flags & MICREL_KS884X))751		/* Ack in the timberdale IP as well */752		iowrite32(0x1, adapter->hw_addr + REG_TIMB_IAR);753 754	if (!netif_running(netdev))755		return;756 757	if (isr & IRQ_LINK_CHANGE)758		ks8842_update_link_status(netdev, adapter);759 760	/* should not get IRQ_RX when running DMA mode */761	if (isr & (IRQ_RX | IRQ_RX_ERROR) && !KS8842_USE_DMA(adapter))762		ks8842_handle_rx(netdev, adapter);763 764	/* should only happen when in PIO mode */765	if (isr & IRQ_TX)766		ks8842_handle_tx(netdev, adapter);767 768	if (isr & IRQ_RX_OVERRUN)769		ks8842_handle_rx_overrun(netdev, adapter);770 771	if (isr & IRQ_TX_STOPPED) {772		ks8842_disable_tx(adapter);773		ks8842_enable_tx(adapter);774	}775 776	if (isr & IRQ_RX_STOPPED) {777		ks8842_disable_rx(adapter);778		ks8842_enable_rx(adapter);779	}780 781	/* re-enable interrupts, put back the bank selection register */782	spin_lock_irqsave(&adapter->lock, flags);783	if (KS8842_USE_DMA(adapter))784		ks8842_write16(adapter, 18, ENABLED_IRQS_DMA, REG_IER);785	else786		ks8842_write16(adapter, 18, ENABLED_IRQS, REG_IER);787	iowrite16(entry_bank, adapter->hw_addr + REG_SELECT_BANK);788 789	/* Make sure timberdale continues DMA operations, they are stopped while790	   we are handling the ks8842 because we might change bank */791	if (KS8842_USE_DMA(adapter))792		ks8842_resume_dma(adapter);793 794	spin_unlock_irqrestore(&adapter->lock, flags);795}796 797static irqreturn_t ks8842_irq(int irq, void *devid)798{799	struct net_device *netdev = devid;800	struct ks8842_adapter *adapter = netdev_priv(netdev);801	u16 isr;802	u16 entry_bank = ioread16(adapter->hw_addr + REG_SELECT_BANK);803	irqreturn_t ret = IRQ_NONE;804 805	isr = ks8842_read16(adapter, 18, REG_ISR);806	netdev_dbg(netdev, "%s - ISR: 0x%x\n", __func__, isr);807 808	if (isr) {809		if (KS8842_USE_DMA(adapter))810			/* disable all but RX IRQ, since the FPGA relies on it*/811			ks8842_write16(adapter, 18, IRQ_RX, REG_IER);812		else813			/* disable IRQ */814			ks8842_write16(adapter, 18, 0x00, REG_IER);815 816		/* schedule tasklet */817		tasklet_schedule(&adapter->tasklet);818 819		ret = IRQ_HANDLED;820	}821 822	iowrite16(entry_bank, adapter->hw_addr + REG_SELECT_BANK);823 824	/* After an interrupt, tell timberdale to continue DMA operations.825	   DMA is disabled while we are handling the ks8842 because we might826	   change bank */827	ks8842_resume_dma(adapter);828 829	return ret;830}831 832static void ks8842_dma_rx_cb(void *data)833{834	struct net_device	*netdev = data;835	struct ks8842_adapter	*adapter = netdev_priv(netdev);836 837	netdev_dbg(netdev, "RX DMA finished\n");838	/* schedule tasklet */839	if (adapter->dma_rx.adesc)840		tasklet_schedule(&adapter->dma_rx.tasklet);841}842 843static void ks8842_dma_tx_cb(void *data)844{845	struct net_device		*netdev = data;846	struct ks8842_adapter		*adapter = netdev_priv(netdev);847	struct ks8842_tx_dma_ctl	*ctl = &adapter->dma_tx;848 849	netdev_dbg(netdev, "TX DMA finished\n");850 851	if (!ctl->adesc)852		return;853 854	netdev->stats.tx_packets++;855	ctl->adesc = NULL;856 857	if (netif_queue_stopped(netdev))858		netif_wake_queue(netdev);859}860 861static void ks8842_stop_dma(struct ks8842_adapter *adapter)862{863	struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;864	struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;865 866	tx_ctl->adesc = NULL;867	if (tx_ctl->chan)868		dmaengine_terminate_all(tx_ctl->chan);869 870	rx_ctl->adesc = NULL;871	if (rx_ctl->chan)872		dmaengine_terminate_all(rx_ctl->chan);873 874	if (sg_dma_address(&rx_ctl->sg))875		dma_unmap_single(adapter->dev, sg_dma_address(&rx_ctl->sg),876			DMA_BUFFER_SIZE, DMA_FROM_DEVICE);877	sg_dma_address(&rx_ctl->sg) = 0;878 879	dev_kfree_skb(rx_ctl->skb);880	rx_ctl->skb = NULL;881}882 883static void ks8842_dealloc_dma_bufs(struct ks8842_adapter *adapter)884{885	struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;886	struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;887 888	ks8842_stop_dma(adapter);889 890	if (tx_ctl->chan)891		dma_release_channel(tx_ctl->chan);892	tx_ctl->chan = NULL;893 894	if (rx_ctl->chan)895		dma_release_channel(rx_ctl->chan);896	rx_ctl->chan = NULL;897 898	tasklet_kill(&rx_ctl->tasklet);899 900	if (sg_dma_address(&tx_ctl->sg))901		dma_unmap_single(adapter->dev, sg_dma_address(&tx_ctl->sg),902			DMA_BUFFER_SIZE, DMA_TO_DEVICE);903	sg_dma_address(&tx_ctl->sg) = 0;904 905	kfree(tx_ctl->buf);906	tx_ctl->buf = NULL;907}908 909static bool ks8842_dma_filter_fn(struct dma_chan *chan, void *filter_param)910{911	return chan->chan_id == (long)filter_param;912}913 914static int ks8842_alloc_dma_bufs(struct net_device *netdev)915{916	struct ks8842_adapter *adapter = netdev_priv(netdev);917	struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;918	struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;919	int err;920 921	dma_cap_mask_t mask;922 923	dma_cap_zero(mask);924	dma_cap_set(DMA_SLAVE, mask);925	dma_cap_set(DMA_PRIVATE, mask);926 927	sg_init_table(&tx_ctl->sg, 1);928 929	tx_ctl->chan = dma_request_channel(mask, ks8842_dma_filter_fn,930					   (void *)(long)tx_ctl->channel);931	if (!tx_ctl->chan) {932		err = -ENODEV;933		goto err;934	}935 936	/* allocate DMA buffer */937	tx_ctl->buf = kmalloc(DMA_BUFFER_SIZE, GFP_KERNEL);938	if (!tx_ctl->buf) {939		err = -ENOMEM;940		goto err;941	}942 943	sg_dma_address(&tx_ctl->sg) = dma_map_single(adapter->dev,944		tx_ctl->buf, DMA_BUFFER_SIZE, DMA_TO_DEVICE);945	if (dma_mapping_error(adapter->dev, sg_dma_address(&tx_ctl->sg))) {946		err = -ENOMEM;947		sg_dma_address(&tx_ctl->sg) = 0;948		goto err;949	}950 951	rx_ctl->chan = dma_request_channel(mask, ks8842_dma_filter_fn,952					   (void *)(long)rx_ctl->channel);953	if (!rx_ctl->chan) {954		err = -ENODEV;955		goto err;956	}957 958	tasklet_setup(&rx_ctl->tasklet, ks8842_rx_frame_dma_tasklet);959 960	return 0;961err:962	ks8842_dealloc_dma_bufs(adapter);963	return err;964}965 966/* Netdevice operations */967 968static int ks8842_open(struct net_device *netdev)969{970	struct ks8842_adapter *adapter = netdev_priv(netdev);971	int err;972 973	netdev_dbg(netdev, "%s - entry\n", __func__);974 975	if (KS8842_USE_DMA(adapter)) {976		err = ks8842_alloc_dma_bufs(netdev);977 978		if (!err) {979			/* start RX dma */980			err = __ks8842_start_new_rx_dma(netdev);981			if (err)982				ks8842_dealloc_dma_bufs(adapter);983		}984 985		if (err) {986			printk(KERN_WARNING DRV_NAME987				": Failed to initiate DMA, running PIO\n");988			ks8842_dealloc_dma_bufs(adapter);989			adapter->dma_rx.channel = -1;990			adapter->dma_tx.channel = -1;991		}992	}993 994	/* reset the HW */995	ks8842_reset_hw(adapter);996 997	ks8842_write_mac_addr(adapter, netdev->dev_addr);998 999	ks8842_update_link_status(netdev, adapter);1000 1001	err = request_irq(adapter->irq, ks8842_irq, IRQF_SHARED, DRV_NAME,1002		netdev);1003	if (err) {1004		pr_err("Failed to request IRQ: %d: %d\n", adapter->irq, err);1005		return err;1006	}1007 1008	return 0;1009}1010 1011static int ks8842_close(struct net_device *netdev)1012{1013	struct ks8842_adapter *adapter = netdev_priv(netdev);1014 1015	netdev_dbg(netdev, "%s - entry\n", __func__);1016 1017	cancel_work_sync(&adapter->timeout_work);1018 1019	if (KS8842_USE_DMA(adapter))1020		ks8842_dealloc_dma_bufs(adapter);1021 1022	/* free the irq */1023	free_irq(adapter->irq, netdev);1024 1025	/* disable the switch */1026	ks8842_write16(adapter, 32, 0x0, REG_SW_ID_AND_ENABLE);1027 1028	return 0;1029}1030 1031static netdev_tx_t ks8842_xmit_frame(struct sk_buff *skb,1032				     struct net_device *netdev)1033{1034	int ret;1035	struct ks8842_adapter *adapter = netdev_priv(netdev);1036 1037	netdev_dbg(netdev, "%s: entry\n", __func__);1038 1039	if (KS8842_USE_DMA(adapter)) {1040		unsigned long flags;1041		ret = ks8842_tx_frame_dma(skb, netdev);1042		/* for now only allow one transfer at the time */1043		spin_lock_irqsave(&adapter->lock, flags);1044		if (adapter->dma_tx.adesc)1045			netif_stop_queue(netdev);1046		spin_unlock_irqrestore(&adapter->lock, flags);1047		return ret;1048	}1049 1050	ret = ks8842_tx_frame(skb, netdev);1051 1052	if (ks8842_tx_fifo_space(adapter) <  netdev->mtu + 8)1053		netif_stop_queue(netdev);1054 1055	return ret;1056}1057 1058static int ks8842_set_mac(struct net_device *netdev, void *p)1059{1060	struct ks8842_adapter *adapter = netdev_priv(netdev);1061	struct sockaddr *addr = p;1062	char *mac = (u8 *)addr->sa_data;1063 1064	netdev_dbg(netdev, "%s: entry\n", __func__);1065 1066	if (!is_valid_ether_addr(addr->sa_data))1067		return -EADDRNOTAVAIL;1068 1069	eth_hw_addr_set(netdev, mac);1070 1071	ks8842_write_mac_addr(adapter, mac);1072	return 0;1073}1074 1075static void ks8842_tx_timeout_work(struct work_struct *work)1076{1077	struct ks8842_adapter *adapter =1078		container_of(work, struct ks8842_adapter, timeout_work);1079	struct net_device *netdev = adapter->netdev;1080	unsigned long flags;1081 1082	netdev_dbg(netdev, "%s: entry\n", __func__);1083 1084	spin_lock_irqsave(&adapter->lock, flags);1085 1086	if (KS8842_USE_DMA(adapter))1087		ks8842_stop_dma(adapter);1088 1089	/* disable interrupts */1090	ks8842_write16(adapter, 18, 0, REG_IER);1091	ks8842_write16(adapter, 18, 0xFFFF, REG_ISR);1092 1093	netif_stop_queue(netdev);1094 1095	spin_unlock_irqrestore(&adapter->lock, flags);1096 1097	ks8842_reset_hw(adapter);1098 1099	ks8842_write_mac_addr(adapter, netdev->dev_addr);1100 1101	ks8842_update_link_status(netdev, adapter);1102 1103	if (KS8842_USE_DMA(adapter))1104		__ks8842_start_new_rx_dma(netdev);1105}1106 1107static void ks8842_tx_timeout(struct net_device *netdev, unsigned int txqueue)1108{1109	struct ks8842_adapter *adapter = netdev_priv(netdev);1110 1111	netdev_dbg(netdev, "%s: entry\n", __func__);1112 1113	schedule_work(&adapter->timeout_work);1114}1115 1116static const struct net_device_ops ks8842_netdev_ops = {1117	.ndo_open		= ks8842_open,1118	.ndo_stop		= ks8842_close,1119	.ndo_start_xmit		= ks8842_xmit_frame,1120	.ndo_set_mac_address	= ks8842_set_mac,1121	.ndo_tx_timeout 	= ks8842_tx_timeout,1122	.ndo_validate_addr	= eth_validate_addr1123};1124 1125static const struct ethtool_ops ks8842_ethtool_ops = {1126	.get_link		= ethtool_op_get_link,1127};1128 1129static int ks8842_probe(struct platform_device *pdev)1130{1131	int err = -ENOMEM;1132	struct resource *iomem;1133	struct net_device *netdev;1134	struct ks8842_adapter *adapter;1135	struct ks8842_platform_data *pdata = dev_get_platdata(&pdev->dev);1136	u16 id;1137	unsigned i;1138 1139	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);1140	if (!iomem) {1141		dev_err(&pdev->dev, "Invalid resource\n");1142		return -EINVAL;1143	}1144	if (!request_mem_region(iomem->start, resource_size(iomem), DRV_NAME))1145		goto err_mem_region;1146 1147	netdev = alloc_etherdev(sizeof(struct ks8842_adapter));1148	if (!netdev)1149		goto err_alloc_etherdev;1150 1151	SET_NETDEV_DEV(netdev, &pdev->dev);1152 1153	adapter = netdev_priv(netdev);1154	adapter->netdev = netdev;1155	INIT_WORK(&adapter->timeout_work, ks8842_tx_timeout_work);1156	adapter->hw_addr = ioremap(iomem->start, resource_size(iomem));1157	adapter->conf_flags = iomem->flags;1158 1159	if (!adapter->hw_addr)1160		goto err_ioremap;1161 1162	adapter->irq = platform_get_irq(pdev, 0);1163	if (adapter->irq < 0) {1164		err = adapter->irq;1165		goto err_get_irq;1166	}1167 1168	adapter->dev = (pdev->dev.parent) ? pdev->dev.parent : &pdev->dev;1169 1170	/* DMA is only supported when accessed via timberdale */1171	if (!(adapter->conf_flags & MICREL_KS884X) && pdata &&1172		(pdata->tx_dma_channel != -1) &&1173		(pdata->rx_dma_channel != -1)) {1174		adapter->dma_rx.channel = pdata->rx_dma_channel;1175		adapter->dma_tx.channel = pdata->tx_dma_channel;1176	} else {1177		adapter->dma_rx.channel = -1;1178		adapter->dma_tx.channel = -1;1179	}1180 1181	tasklet_setup(&adapter->tasklet, ks8842_tasklet);1182	spin_lock_init(&adapter->lock);1183 1184	netdev->netdev_ops = &ks8842_netdev_ops;1185	netdev->ethtool_ops = &ks8842_ethtool_ops;1186 1187	/* Check if a mac address was given */1188	i = netdev->addr_len;1189	if (pdata) {1190		for (i = 0; i < netdev->addr_len; i++)1191			if (pdata->macaddr[i] != 0)1192				break;1193 1194		if (i < netdev->addr_len)1195			/* an address was passed, use it */1196			eth_hw_addr_set(netdev, pdata->macaddr);1197	}1198 1199	if (i == netdev->addr_len) {1200		ks8842_init_mac_addr(adapter);1201 1202		if (!is_valid_ether_addr(netdev->dev_addr))1203			eth_hw_addr_random(netdev);1204	}1205 1206	id = ks8842_read16(adapter, 32, REG_SW_ID_AND_ENABLE);1207 1208	strcpy(netdev->name, "eth%d");1209	err = register_netdev(netdev);1210	if (err)1211		goto err_register;1212 1213	platform_set_drvdata(pdev, netdev);1214 1215	pr_info("Found chip, family: 0x%x, id: 0x%x, rev: 0x%x\n",1216		(id >> 8) & 0xff, (id >> 4) & 0xf, (id >> 1) & 0x7);1217 1218	return 0;1219 1220err_register:1221err_get_irq:1222	iounmap(adapter->hw_addr);1223err_ioremap:1224	free_netdev(netdev);1225err_alloc_etherdev:1226	release_mem_region(iomem->start, resource_size(iomem));1227err_mem_region:1228	return err;1229}1230 1231static void ks8842_remove(struct platform_device *pdev)1232{1233	struct net_device *netdev = platform_get_drvdata(pdev);1234	struct ks8842_adapter *adapter = netdev_priv(netdev);1235	struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);1236 1237	unregister_netdev(netdev);1238	tasklet_kill(&adapter->tasklet);1239	iounmap(adapter->hw_addr);1240	free_netdev(netdev);1241	release_mem_region(iomem->start, resource_size(iomem));1242}1243 1244 1245static struct platform_driver ks8842_platform_driver = {1246	.driver = {1247		.name	= DRV_NAME,1248	},1249	.probe		= ks8842_probe,1250	.remove_new	= ks8842_remove,1251};1252 1253module_platform_driver(ks8842_platform_driver);1254 1255MODULE_DESCRIPTION("Timberdale KS8842 ethernet driver");1256MODULE_AUTHOR("Mocean Laboratories <info@mocean-labs.com>");1257MODULE_LICENSE("GPL v2");1258MODULE_ALIAS("platform:ks8842");1259 1260