18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/* Freescale QUICC Engine HDLC Device Driver
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright 2014 Freescale Semiconductor Inc.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _UCC_HDLC_H_
88c2ecf20Sopenharmony_ci#define _UCC_HDLC_H_
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/kernel.h>
118c2ecf20Sopenharmony_ci#include <linux/list.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <soc/fsl/qe/immap_qe.h>
148c2ecf20Sopenharmony_ci#include <soc/fsl/qe/qe.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <soc/fsl/qe/ucc.h>
178c2ecf20Sopenharmony_ci#include <soc/fsl/qe/ucc_fast.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci/* UCC HDLC event register */
208c2ecf20Sopenharmony_ci#define UCCE_HDLC_RX_EVENTS	\
218c2ecf20Sopenharmony_ci(UCC_HDLC_UCCE_RXF | UCC_HDLC_UCCE_RXB | UCC_HDLC_UCCE_BSY)
228c2ecf20Sopenharmony_ci#define UCCE_HDLC_TX_EVENTS	(UCC_HDLC_UCCE_TXB | UCC_HDLC_UCCE_TXE)
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistruct ucc_hdlc_param {
258c2ecf20Sopenharmony_ci	__be16 riptr;
268c2ecf20Sopenharmony_ci	__be16 tiptr;
278c2ecf20Sopenharmony_ci	__be16 res0;
288c2ecf20Sopenharmony_ci	__be16 mrblr;
298c2ecf20Sopenharmony_ci	__be32 rstate;
308c2ecf20Sopenharmony_ci	__be32 rbase;
318c2ecf20Sopenharmony_ci	__be16 rbdstat;
328c2ecf20Sopenharmony_ci	__be16 rbdlen;
338c2ecf20Sopenharmony_ci	__be32 rdptr;
348c2ecf20Sopenharmony_ci	__be32 tstate;
358c2ecf20Sopenharmony_ci	__be32 tbase;
368c2ecf20Sopenharmony_ci	__be16 tbdstat;
378c2ecf20Sopenharmony_ci	__be16 tbdlen;
388c2ecf20Sopenharmony_ci	__be32 tdptr;
398c2ecf20Sopenharmony_ci	__be32 rbptr;
408c2ecf20Sopenharmony_ci	__be32 tbptr;
418c2ecf20Sopenharmony_ci	__be32 rcrc;
428c2ecf20Sopenharmony_ci	__be32 res1;
438c2ecf20Sopenharmony_ci	__be32 tcrc;
448c2ecf20Sopenharmony_ci	__be32 res2;
458c2ecf20Sopenharmony_ci	__be32 res3;
468c2ecf20Sopenharmony_ci	__be32 c_mask;
478c2ecf20Sopenharmony_ci	__be32 c_pres;
488c2ecf20Sopenharmony_ci	__be16 disfc;
498c2ecf20Sopenharmony_ci	__be16 crcec;
508c2ecf20Sopenharmony_ci	__be16 abtsc;
518c2ecf20Sopenharmony_ci	__be16 nmarc;
528c2ecf20Sopenharmony_ci	__be32 max_cnt;
538c2ecf20Sopenharmony_ci	__be16 mflr;
548c2ecf20Sopenharmony_ci	__be16 rfthr;
558c2ecf20Sopenharmony_ci	__be16 rfcnt;
568c2ecf20Sopenharmony_ci	__be16 hmask;
578c2ecf20Sopenharmony_ci	__be16 haddr1;
588c2ecf20Sopenharmony_ci	__be16 haddr2;
598c2ecf20Sopenharmony_ci	__be16 haddr3;
608c2ecf20Sopenharmony_ci	__be16 haddr4;
618c2ecf20Sopenharmony_ci	__be16 ts_tmp;
628c2ecf20Sopenharmony_ci	__be16 tmp_mb;
638c2ecf20Sopenharmony_ci};
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cistruct ucc_hdlc_private {
668c2ecf20Sopenharmony_ci	struct ucc_tdm	*utdm;
678c2ecf20Sopenharmony_ci	struct ucc_tdm_info *ut_info;
688c2ecf20Sopenharmony_ci	struct ucc_fast_private *uccf;
698c2ecf20Sopenharmony_ci	struct device *dev;
708c2ecf20Sopenharmony_ci	struct net_device *ndev;
718c2ecf20Sopenharmony_ci	struct napi_struct napi;
728c2ecf20Sopenharmony_ci	struct ucc_fast __iomem *uf_regs;	/* UCC Fast registers */
738c2ecf20Sopenharmony_ci	struct ucc_hdlc_param __iomem *ucc_pram;
748c2ecf20Sopenharmony_ci	u16 tsa;
758c2ecf20Sopenharmony_ci	bool hdlc_busy;
768c2ecf20Sopenharmony_ci	bool loopback;
778c2ecf20Sopenharmony_ci	bool hdlc_bus;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	u8 *tx_buffer;
808c2ecf20Sopenharmony_ci	u8 *rx_buffer;
818c2ecf20Sopenharmony_ci	dma_addr_t dma_tx_addr;
828c2ecf20Sopenharmony_ci	dma_addr_t dma_rx_addr;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	struct qe_bd *tx_bd_base;
858c2ecf20Sopenharmony_ci	struct qe_bd *rx_bd_base;
868c2ecf20Sopenharmony_ci	dma_addr_t dma_tx_bd;
878c2ecf20Sopenharmony_ci	dma_addr_t dma_rx_bd;
888c2ecf20Sopenharmony_ci	struct qe_bd *curtx_bd;
898c2ecf20Sopenharmony_ci	struct qe_bd *currx_bd;
908c2ecf20Sopenharmony_ci	struct qe_bd *dirty_tx;
918c2ecf20Sopenharmony_ci	u16 currx_bdnum;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	struct sk_buff **tx_skbuff;
948c2ecf20Sopenharmony_ci	struct sk_buff **rx_skbuff;
958c2ecf20Sopenharmony_ci	u16 skb_curtx;
968c2ecf20Sopenharmony_ci	u16 skb_currx;
978c2ecf20Sopenharmony_ci	unsigned short skb_dirtytx;
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci	unsigned short tx_ring_size;
1008c2ecf20Sopenharmony_ci	unsigned short rx_ring_size;
1018c2ecf20Sopenharmony_ci	s32 ucc_pram_offset;
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	unsigned short encoding;
1048c2ecf20Sopenharmony_ci	unsigned short parity;
1058c2ecf20Sopenharmony_ci	unsigned short hmask;
1068c2ecf20Sopenharmony_ci	u32 clocking;
1078c2ecf20Sopenharmony_ci	spinlock_t lock;	/* lock for Tx BD and Tx buffer */
1088c2ecf20Sopenharmony_ci#ifdef CONFIG_PM
1098c2ecf20Sopenharmony_ci	struct ucc_hdlc_param *ucc_pram_bak;
1108c2ecf20Sopenharmony_ci	u32 gumr;
1118c2ecf20Sopenharmony_ci	u8 guemr;
1128c2ecf20Sopenharmony_ci	u32 cmxsi1cr_l, cmxsi1cr_h;
1138c2ecf20Sopenharmony_ci	u32 cmxsi1syr;
1148c2ecf20Sopenharmony_ci	u32 cmxucr[4];
1158c2ecf20Sopenharmony_ci#endif
1168c2ecf20Sopenharmony_ci};
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci#define TX_BD_RING_LEN	0x10
1198c2ecf20Sopenharmony_ci#define RX_BD_RING_LEN	0x20
1208c2ecf20Sopenharmony_ci#define RX_CLEAN_MAX	0x10
1218c2ecf20Sopenharmony_ci#define NUM_OF_BUF	4
1228c2ecf20Sopenharmony_ci#define MAX_RX_BUF_LENGTH	(48 * 0x20)
1238c2ecf20Sopenharmony_ci#define MAX_FRAME_LENGTH	(MAX_RX_BUF_LENGTH + 8)
1248c2ecf20Sopenharmony_ci#define ALIGNMENT_OF_UCC_HDLC_PRAM	64
1258c2ecf20Sopenharmony_ci#define SI_BANK_SIZE	128
1268c2ecf20Sopenharmony_ci#define MAX_HDLC_NUM	4
1278c2ecf20Sopenharmony_ci#define HDLC_HEAD_LEN	2
1288c2ecf20Sopenharmony_ci#define HDLC_CRC_SIZE	2
1298c2ecf20Sopenharmony_ci#define TX_RING_MOD_MASK(size) (size - 1)
1308c2ecf20Sopenharmony_ci#define RX_RING_MOD_MASK(size) (size - 1)
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci#define HDLC_HEAD_MASK		0x0000
1338c2ecf20Sopenharmony_ci#define DEFAULT_HDLC_HEAD	0xff44
1348c2ecf20Sopenharmony_ci#define DEFAULT_ADDR_MASK	0x00ff
1358c2ecf20Sopenharmony_ci#define DEFAULT_HDLC_ADDR	0x00ff
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci#define BMR_GBL			0x20000000
1388c2ecf20Sopenharmony_ci#define BMR_BIG_ENDIAN		0x10000000
1398c2ecf20Sopenharmony_ci#define CRC_16BIT_MASK		0x0000F0B8
1408c2ecf20Sopenharmony_ci#define CRC_16BIT_PRES		0x0000FFFF
1418c2ecf20Sopenharmony_ci#define DEFAULT_RFTHR		1
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci#define DEFAULT_PPP_HEAD    0xff03
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci#endif
146