Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * hfcpci.c     low level driver for CCD's hfc-pci based cards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  * Author     Werner Cornelius (werner@isdn4linux.de)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  *            based on existing driver for CCD hfc ISA cards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  *            type approval valid for HFC-S PCI A based card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  * Copyright 1999  by Werner Cornelius (werner@isdn-development.de)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  * Copyright 2008  by Karsten Keil <kkeil@novell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  * Module options:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)  * debug:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)  *	NOTE: only one poll value must be given for all cards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17)  *	See hfc_pci.h for debug flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)  * poll:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20)  *	NOTE: only one poll value must be given for all cards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)  *	Give the number of samples for each fifo process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22)  *	By default 128 is used. Decrease to reduce delay, increase to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23)  *	reduce cpu load. If unsure, don't mess with it!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24)  *	A value of 128 will use controller's interrupt. Other values will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25)  *	use kernel timer, because the controller will not allow lower values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26)  *	than 128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27)  *	Also note that the value depends on the kernel timer frequency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)  *	If kernel uses a frequency of 1000 Hz, steps of 8 samples are possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  *	If the kernel uses 100 Hz, steps of 80 samples are possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)  *	If the kernel uses 300 Hz, steps of about 26 samples are possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #include <linux/mISDNhw.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #include "hfc_pci.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) static const char *hfcpci_revision = "2.0";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) static int HFC_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) static uint debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) static uint poll, tics;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) static struct timer_list hfc_tl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) static unsigned long hfc_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) MODULE_AUTHOR("Karsten Keil");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) module_param(debug, uint, S_IRUGO | S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) module_param(poll, uint, S_IRUGO | S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 	HFC_CCD_2BD0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	HFC_CCD_B000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	HFC_CCD_B006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	HFC_CCD_B007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	HFC_CCD_B008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	HFC_CCD_B009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	HFC_CCD_B00A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	HFC_CCD_B00B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	HFC_CCD_B00C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	HFC_CCD_B100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	HFC_CCD_B700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	HFC_CCD_B701,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	HFC_ASUS_0675,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	HFC_BERKOM_A1T,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	HFC_BERKOM_TCONCEPT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	HFC_ANIGMA_MC145575,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 	HFC_ZOLTRIX_2BD0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 	HFC_DIGI_DF_M_IOM2_E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	HFC_DIGI_DF_M_E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 	HFC_DIGI_DF_M_IOM2_A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 	HFC_DIGI_DF_M_A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	HFC_ABOCOM_2BD1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	HFC_SITECOM_DC105V2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) struct hfcPCI_hw {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	unsigned char		cirm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	unsigned char		ctmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	unsigned char		clkdel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	unsigned char		states;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	unsigned char		conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	unsigned char		mst_m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	unsigned char		int_m1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	unsigned char		int_m2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	unsigned char		sctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 	unsigned char		sctrl_r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	unsigned char		sctrl_e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	unsigned char		trm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	unsigned char		fifo_en;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	unsigned char		bswapped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	unsigned char		protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 	int			nt_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 	unsigned char __iomem	*pci_io; /* start of PCI IO memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	dma_addr_t		dmahandle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	void			*fifos; /* FIFO memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	int			last_bfifo_cnt[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	/* marker saving last b-fifo frame count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	struct timer_list	timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #define	HFC_CFG_MASTER		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #define HFC_CFG_SLAVE		2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) #define	HFC_CFG_PCM		3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #define HFC_CFG_2HFC		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) #define HFC_CFG_SLAVEHFC	5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) #define HFC_CFG_NEG_F0		6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define HFC_CFG_SW_DD_DU	7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) #define FLG_HFC_TIMER_T1	16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #define FLG_HFC_TIMER_T3	17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) #define NT_T1_COUNT	1120	/* number of 3.125ms interrupts (3.5s) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) #define NT_T3_COUNT	31	/* number of 3.125ms interrupts (97 ms) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #define CLKDEL_TE	0x0e	/* CLKDEL in TE mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) #define CLKDEL_NT	0x6c	/* CLKDEL in NT mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) struct hfc_pci {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	u_char			subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	u_char			chanlimit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	u_char			initdone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	u_long			cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	u_int			irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	u_int			irqcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	struct pci_dev		*pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	struct hfcPCI_hw	hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	spinlock_t		lock;	/* card lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	struct dchannel		dch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	struct bchannel		bch[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) /* Interface functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) enable_hwirq(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	hc->hw.int_m2 |= HFCPCI_IRQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	Write_hfc(hc, HFCPCI_INT_M2, hc->hw.int_m2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) disable_hwirq(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	hc->hw.int_m2 &= ~((u_char)HFCPCI_IRQ_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	Write_hfc(hc, HFCPCI_INT_M2, hc->hw.int_m2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153)  * free hardware resources used by driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) release_io_hfcpci(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	/* disable memory mapped ports + busmaster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	pci_write_config_word(hc->pdev, PCI_COMMAND, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	del_timer(&hc->hw.timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	dma_free_coherent(&hc->pdev->dev, 0x8000, hc->hw.fifos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 			  hc->hw.dmahandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	iounmap(hc->hw.pci_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167)  * set mode (NT or TE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) hfcpci_setmode(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	if (hc->hw.protocol == ISDN_P_NT_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 		hc->hw.clkdel = CLKDEL_NT;	/* ST-Bit delay for NT-Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 		hc->hw.sctrl |= SCTRL_MODE_NT;	/* NT-MODE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 		hc->hw.states = 1;		/* G1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 		hc->hw.clkdel = CLKDEL_TE;	/* ST-Bit delay for TE-Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 		hc->hw.sctrl &= ~SCTRL_MODE_NT;	/* TE-MODE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 		hc->hw.states = 2;		/* F2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	Write_hfc(hc, HFCPCI_CLKDEL, hc->hw.clkdel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	Write_hfc(hc, HFCPCI_STATES, HFCPCI_LOAD_STATE | hc->hw.states);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	udelay(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	Write_hfc(hc, HFCPCI_STATES, hc->hw.states | 0x40); /* Deactivate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	Write_hfc(hc, HFCPCI_SCTRL, hc->hw.sctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189)  * function called to reset the HFC PCI chip. A complete software reset of chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190)  * and fifos is done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) reset_hfcpci(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	u_char	val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	int	cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	printk(KERN_DEBUG "reset_hfcpci: entered\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	val = Read_hfc(hc, HFCPCI_CHIP_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	printk(KERN_INFO "HFC_PCI: resetting HFC ChipId(%x)\n", val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	/* enable memory mapped ports, disable busmaster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	pci_write_config_word(hc->pdev, PCI_COMMAND, PCI_ENA_MEMIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	disable_hwirq(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	/* enable memory ports + busmaster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	pci_write_config_word(hc->pdev, PCI_COMMAND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 			      PCI_ENA_MEMIO + PCI_ENA_MASTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	val = Read_hfc(hc, HFCPCI_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	printk(KERN_DEBUG "HFC-PCI status(%x) before reset\n", val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	hc->hw.cirm = HFCPCI_RESET;	/* Reset On */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 	Write_hfc(hc, HFCPCI_CIRM, hc->hw.cirm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	set_current_state(TASK_UNINTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 	mdelay(10);			/* Timeout 10ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	hc->hw.cirm = 0;		/* Reset Off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	Write_hfc(hc, HFCPCI_CIRM, hc->hw.cirm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	val = Read_hfc(hc, HFCPCI_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	printk(KERN_DEBUG "HFC-PCI status(%x) after reset\n", val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 	while (cnt < 50000) { /* max 50000 us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 		udelay(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 		cnt += 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 		val = Read_hfc(hc, HFCPCI_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 		if (!(val & 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	printk(KERN_DEBUG "HFC-PCI status(%x) after %dus\n", val, cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 	hc->hw.fifo_en = 0x30;	/* only D fifos enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	hc->hw.bswapped = 0;	/* no exchange */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	hc->hw.ctmt = HFCPCI_TIM3_125 | HFCPCI_AUTO_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	hc->hw.trm = HFCPCI_BTRANS_THRESMASK; /* no echo connect , threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	hc->hw.sctrl = 0x40;	/* set tx_lo mode, error in datasheet ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	hc->hw.sctrl_r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	hc->hw.sctrl_e = HFCPCI_AUTO_AWAKE;	/* S/T Auto awake */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	hc->hw.mst_m = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 	if (test_bit(HFC_CFG_MASTER, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 		hc->hw.mst_m |= HFCPCI_MASTER;	/* HFC Master Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	if (test_bit(HFC_CFG_NEG_F0, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 		hc->hw.mst_m |= HFCPCI_F0_NEGATIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	Write_hfc(hc, HFCPCI_TRM, hc->hw.trm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	Write_hfc(hc, HFCPCI_SCTRL_E, hc->hw.sctrl_e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	hc->hw.int_m1 = HFCPCI_INTS_DTRANS | HFCPCI_INTS_DREC |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 		HFCPCI_INTS_L1STATE | HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	/* Clear already pending ints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	val = Read_hfc(hc, HFCPCI_INT_S1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	/* set NT/TE mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	hfcpci_setmode(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	Write_hfc(hc, HFCPCI_SCTRL_R, hc->hw.sctrl_r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	 * Init GCI/IOM2 in master mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	 * Slots 0 and 1 are set for B-chan 1 and 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	 * D- and monitor/CI channel are not enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	 * STIO1 is used as output for data, B1+B2 from ST->IOM+HFC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 	 * STIO2 is used as data input, B1+B2 from IOM->ST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	 * ST B-channel send disabled -> continuous 1s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	 * The IOM slots are always enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	if (test_bit(HFC_CFG_PCM, &hc->cfg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 		/* set data flow directions: connect B1,B2: HFC to/from PCM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 		hc->hw.conn = 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 		hc->hw.conn = 0x36;	/* set data flow directions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 		if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 			Write_hfc(hc, HFCPCI_B1_SSL, 0xC0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 			Write_hfc(hc, HFCPCI_B2_SSL, 0xC1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 			Write_hfc(hc, HFCPCI_B1_RSL, 0xC0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 			Write_hfc(hc, HFCPCI_B2_RSL, 0xC1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 			Write_hfc(hc, HFCPCI_B1_SSL, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 			Write_hfc(hc, HFCPCI_B2_SSL, 0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 			Write_hfc(hc, HFCPCI_B1_RSL, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 			Write_hfc(hc, HFCPCI_B2_RSL, 0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	val = Read_hfc(hc, HFCPCI_INT_S2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288)  * Timer function called when kernel timer expires
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) hfcpci_Timer(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	struct hfc_pci *hc = from_timer(hc, t, hw.timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	hc->hw.timer.expires = jiffies + 75;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	/* WD RESET */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297)  *	WriteReg(hc, HFCD_DATA, HFCD_CTMT, hc->hw.ctmt | 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298)  *	add_timer(&hc->hw.timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304)  * select a b-channel entry matching and active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) static struct bchannel *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) Sel_BCS(struct hfc_pci *hc, int channel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	if (test_bit(FLG_ACTIVE, &hc->bch[0].Flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	    (hc->bch[0].nr & channel))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 		return &hc->bch[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	else if (test_bit(FLG_ACTIVE, &hc->bch[1].Flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 		 (hc->bch[1].nr & channel))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 		return &hc->bch[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320)  * clear the desired B-channel rx fifo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) hfcpci_clear_fifo_rx(struct hfc_pci *hc, int fifo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	u_char		fifo_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	struct bzfifo	*bzr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	if (fifo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 		bzr = &((union fifo_area *)(hc->hw.fifos))->b_chans.rxbz_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 		fifo_state = hc->hw.fifo_en & HFCPCI_FIFOEN_B2RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 		bzr = &((union fifo_area *)(hc->hw.fifos))->b_chans.rxbz_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 		fifo_state = hc->hw.fifo_en & HFCPCI_FIFOEN_B1RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	if (fifo_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 		hc->hw.fifo_en ^= fifo_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	hc->hw.last_bfifo_cnt[fifo] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	bzr->f1 = MAX_B_FRAMES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	bzr->f2 = bzr->f1;	/* init F pointers to remain constant */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	bzr->za[MAX_B_FRAMES].z1 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	bzr->za[MAX_B_FRAMES].z2 = cpu_to_le16(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 		le16_to_cpu(bzr->za[MAX_B_FRAMES].z1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	if (fifo_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 		hc->hw.fifo_en |= fifo_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350)  * clear the desired B-channel tx fifo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) static void hfcpci_clear_fifo_tx(struct hfc_pci *hc, int fifo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	u_char		fifo_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	struct bzfifo	*bzt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	if (fifo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 		bzt = &((union fifo_area *)(hc->hw.fifos))->b_chans.txbz_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 		fifo_state = hc->hw.fifo_en & HFCPCI_FIFOEN_B2TX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 		bzt = &((union fifo_area *)(hc->hw.fifos))->b_chans.txbz_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 		fifo_state = hc->hw.fifo_en & HFCPCI_FIFOEN_B1TX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	if (fifo_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 		hc->hw.fifo_en ^= fifo_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	if (hc->bch[fifo].debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 		printk(KERN_DEBUG "hfcpci_clear_fifo_tx%d f1(%x) f2(%x) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 		       "z1(%x) z2(%x) state(%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 		       fifo, bzt->f1, bzt->f2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 		       le16_to_cpu(bzt->za[MAX_B_FRAMES].z1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 		       le16_to_cpu(bzt->za[MAX_B_FRAMES].z2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 		       fifo_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	bzt->f2 = MAX_B_FRAMES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	bzt->f1 = bzt->f2;	/* init F pointers to remain constant */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	bzt->za[MAX_B_FRAMES].z1 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	bzt->za[MAX_B_FRAMES].z2 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	if (fifo_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 		hc->hw.fifo_en |= fifo_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	if (hc->bch[fifo].debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 		printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 		       "hfcpci_clear_fifo_tx%d f1(%x) f2(%x) z1(%x) z2(%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 		       fifo, bzt->f1, bzt->f2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 		       le16_to_cpu(bzt->za[MAX_B_FRAMES].z1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 		       le16_to_cpu(bzt->za[MAX_B_FRAMES].z2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)  * read a complete B-frame out of the buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) hfcpci_empty_bfifo(struct bchannel *bch, struct bzfifo *bz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 		   u_char *bdata, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	u_char		*ptr, *ptr1, new_f2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	int		maxlen, new_z2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	struct zt	*zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	if ((bch->debug & DEBUG_HW_BCHANNEL) && !(bch->debug & DEBUG_HW_BFIFO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 		printk(KERN_DEBUG "hfcpci_empty_fifo\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	zp = &bz->za[bz->f2];	/* point to Z-Regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	new_z2 = le16_to_cpu(zp->z2) + count;	/* new position in fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	if (new_z2 >= (B_FIFO_SIZE + B_SUB_VAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 		new_z2 -= B_FIFO_SIZE;	/* buffer wrap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	new_f2 = (bz->f2 + 1) & MAX_B_FRAMES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	if ((count > MAX_DATA_SIZE + 3) || (count < 4) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	    (*(bdata + (le16_to_cpu(zp->z1) - B_SUB_VAL)))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 		if (bch->debug & DEBUG_HW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 			printk(KERN_DEBUG "hfcpci_empty_fifo: incoming packet "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 			       "invalid length %d or crc\n", count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) #ifdef ERROR_STATISTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 		bch->err_inv++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 		bz->za[new_f2].z2 = cpu_to_le16(new_z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 		bz->f2 = new_f2;	/* next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 		bch->rx_skb = mI_alloc_skb(count - 3, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		if (!bch->rx_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			printk(KERN_WARNING "HFCPCI: receive out of memory\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 		count -= 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 		ptr = skb_put(bch->rx_skb, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 		if (le16_to_cpu(zp->z2) + count <= B_FIFO_SIZE + B_SUB_VAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 			maxlen = count;		/* complete transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 			maxlen = B_FIFO_SIZE + B_SUB_VAL -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 				le16_to_cpu(zp->z2);	/* maximum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 		ptr1 = bdata + (le16_to_cpu(zp->z2) - B_SUB_VAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 		/* start of data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 		memcpy(ptr, ptr1, maxlen);	/* copy data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 		count -= maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 		if (count) {	/* rest remaining */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 			ptr += maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 			ptr1 = bdata;	/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 			memcpy(ptr, ptr1, count);	/* rest */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 		bz->za[new_f2].z2 = cpu_to_le16(new_z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 		bz->f2 = new_f2;	/* next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 		recv_Bchannel(bch, MISDN_ID_ANY, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449)  * D-channel receive procedure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) receive_dmsg(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	struct dchannel	*dch = &hc->dch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	int		maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	int		rcnt, total;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	int		count = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	u_char		*ptr, *ptr1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	struct dfifo	*df;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	struct zt	*zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	df = &((union fifo_area *)(hc->hw.fifos))->d_chan.d_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	while (((df->f1 & D_FREG_MASK) != (df->f2 & D_FREG_MASK)) && count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 		zp = &df->za[df->f2 & D_FREG_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 		rcnt = le16_to_cpu(zp->z1) - le16_to_cpu(zp->z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 		if (rcnt < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 			rcnt += D_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 		rcnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 		if (dch->debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 			printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 			       "hfcpci recd f1(%d) f2(%d) z1(%x) z2(%x) cnt(%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 			       df->f1, df->f2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 			       le16_to_cpu(zp->z1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 			       le16_to_cpu(zp->z2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 			       rcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 		if ((rcnt > MAX_DFRAME_LEN + 3) || (rcnt < 4) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 		    (df->data[le16_to_cpu(zp->z1)])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 			if (dch->debug & DEBUG_HW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 				printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 				       "empty_fifo hfcpci packet inv. len "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 				       "%d or crc %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 				       rcnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 				       df->data[le16_to_cpu(zp->z1)]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) #ifdef ERROR_STATISTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 			cs->err_rx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 			df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 				(MAX_D_FRAMES + 1);	/* next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 			df->za[df->f2 & D_FREG_MASK].z2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 				cpu_to_le16((le16_to_cpu(zp->z2) + rcnt) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 					    (D_FIFO_SIZE - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 			dch->rx_skb = mI_alloc_skb(rcnt - 3, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 			if (!dch->rx_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 				printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 				       "HFC-PCI: D receive out of memory\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 			total = rcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 			rcnt -= 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 			ptr = skb_put(dch->rx_skb, rcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 			if (le16_to_cpu(zp->z2) + rcnt <= D_FIFO_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 				maxlen = rcnt;	/* complete transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 				maxlen = D_FIFO_SIZE - le16_to_cpu(zp->z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 			/* maximum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 			ptr1 = df->data + le16_to_cpu(zp->z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 			/* start of data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 			memcpy(ptr, ptr1, maxlen);	/* copy data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 			rcnt -= maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 			if (rcnt) {	/* rest remaining */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 				ptr += maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 				ptr1 = df->data;	/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 				memcpy(ptr, ptr1, rcnt);	/* rest */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 			df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 				(MAX_D_FRAMES + 1);	/* next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 			df->za[df->f2 & D_FREG_MASK].z2 = cpu_to_le16((
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 									      le16_to_cpu(zp->z2) + total) & (D_FIFO_SIZE - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 			recv_Dchannel(dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531)  * check for transparent receive data and read max one 'poll' size if avail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *rxbz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 			struct bzfifo *txbz, u_char *bdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	__le16	*z1r, *z2r, *z1t, *z2t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	int	new_z2, fcnt_rx, fcnt_tx, maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	u_char	*ptr, *ptr1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	z1r = &rxbz->za[MAX_B_FRAMES].z1;	/* pointer to z reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	z2r = z1r + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	z1t = &txbz->za[MAX_B_FRAMES].z1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 	z2t = z1t + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 	fcnt_rx = le16_to_cpu(*z1r) - le16_to_cpu(*z2r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	if (!fcnt_rx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 		return;	/* no data avail */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	if (fcnt_rx <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 		fcnt_rx += B_FIFO_SIZE;	/* bytes actually buffered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	new_z2 = le16_to_cpu(*z2r) + fcnt_rx;	/* new position in fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	if (new_z2 >= (B_FIFO_SIZE + B_SUB_VAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 		new_z2 -= B_FIFO_SIZE;	/* buffer wrap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	fcnt_tx = le16_to_cpu(*z2t) - le16_to_cpu(*z1t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	if (fcnt_tx <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 		fcnt_tx += B_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	/* fcnt_tx contains available bytes in tx-fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	fcnt_tx = B_FIFO_SIZE - fcnt_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	/* remaining bytes to send (bytes in tx-fifo) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	if (test_bit(FLG_RX_OFF, &bch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 		bch->dropcnt += fcnt_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		*z2r = cpu_to_le16(new_z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	maxlen = bchannel_get_rxbuf(bch, fcnt_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	if (maxlen < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 		pr_warn("B%d: No bufferspace for %d bytes\n", bch->nr, fcnt_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 		ptr = skb_put(bch->rx_skb, fcnt_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 		if (le16_to_cpu(*z2r) + fcnt_rx <= B_FIFO_SIZE + B_SUB_VAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 			maxlen = fcnt_rx;	/* complete transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 			maxlen = B_FIFO_SIZE + B_SUB_VAL - le16_to_cpu(*z2r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		/* maximum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 		ptr1 = bdata + (le16_to_cpu(*z2r) - B_SUB_VAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 		/* start of data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 		memcpy(ptr, ptr1, maxlen);	/* copy data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 		fcnt_rx -= maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 		if (fcnt_rx) {	/* rest remaining */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 			ptr += maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 			ptr1 = bdata;	/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 			memcpy(ptr, ptr1, fcnt_rx);	/* rest */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 		recv_Bchannel(bch, fcnt_tx, false); /* bch, id, !force */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	*z2r = cpu_to_le16(new_z2);		/* new position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595)  * B-channel main receive routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) main_rec_hfcpci(struct bchannel *bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	struct hfc_pci	*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	int		rcnt, real_fifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	int		receive = 0, count = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	struct bzfifo	*txbz, *rxbz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	u_char		*bdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	struct zt	*zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	if ((bch->nr & 2) && (!hc->hw.bswapped)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		rxbz = &((union fifo_area *)(hc->hw.fifos))->b_chans.rxbz_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 		txbz = &((union fifo_area *)(hc->hw.fifos))->b_chans.txbz_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 		bdata = ((union fifo_area *)(hc->hw.fifos))->b_chans.rxdat_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 		real_fifo = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 		rxbz = &((union fifo_area *)(hc->hw.fifos))->b_chans.rxbz_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		txbz = &((union fifo_area *)(hc->hw.fifos))->b_chans.txbz_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 		bdata = ((union fifo_area *)(hc->hw.fifos))->b_chans.rxdat_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		real_fifo = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) Begin:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	if (rxbz->f1 != rxbz->f2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 		if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 			printk(KERN_DEBUG "hfcpci rec ch(%x) f1(%d) f2(%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 			       bch->nr, rxbz->f1, rxbz->f2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 		zp = &rxbz->za[rxbz->f2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 		rcnt = le16_to_cpu(zp->z1) - le16_to_cpu(zp->z2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 		if (rcnt < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 			rcnt += B_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 		rcnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 		if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 			printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 			       "hfcpci rec ch(%x) z1(%x) z2(%x) cnt(%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 			       bch->nr, le16_to_cpu(zp->z1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 			       le16_to_cpu(zp->z2), rcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 		hfcpci_empty_bfifo(bch, rxbz, bdata, rcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 		rcnt = rxbz->f1 - rxbz->f2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 		if (rcnt < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 			rcnt += MAX_B_FRAMES + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 		if (hc->hw.last_bfifo_cnt[real_fifo] > rcnt + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 			rcnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 			hfcpci_clear_fifo_rx(hc, real_fifo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 		hc->hw.last_bfifo_cnt[real_fifo] = rcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 		if (rcnt > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 			receive = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 			receive = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	} else if (test_bit(FLG_TRANSPARENT, &bch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 		hfcpci_empty_fifo_trans(bch, rxbz, txbz, bdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 		receive = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	if (count && receive)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 		goto Begin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659)  * D-channel send routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) hfcpci_fill_dfifo(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	struct dchannel	*dch = &hc->dch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	int		fcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 	int		count, new_z1, maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	struct dfifo	*df;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 	u_char		*src, *dst, new_f1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	if ((dch->debug & DEBUG_HW_DCHANNEL) && !(dch->debug & DEBUG_HW_DFIFO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 		printk(KERN_DEBUG "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	if (!dch->tx_skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	count = dch->tx_skb->len - dch->tx_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 	if (count <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 	df = &((union fifo_area *) (hc->hw.fifos))->d_chan.d_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	if (dch->debug & DEBUG_HW_DFIFO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 		printk(KERN_DEBUG "%s:f1(%d) f2(%d) z1(f1)(%x)\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 		       df->f1, df->f2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 		       le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	fcnt = df->f1 - df->f2;	/* frame count actually buffered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	if (fcnt < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 		fcnt += (MAX_D_FRAMES + 1);	/* if wrap around */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	if (fcnt > (MAX_D_FRAMES - 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 		if (dch->debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 			printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 			       "hfcpci_fill_Dfifo more as 14 frames\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) #ifdef ERROR_STATISTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 		cs->err_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	/* now determine free bytes in FIFO buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	maxlen = le16_to_cpu(df->za[df->f2 & D_FREG_MASK].z2) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 		le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	if (maxlen <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 		maxlen += D_FIFO_SIZE;	/* count now contains available bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 	if (dch->debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 		printk(KERN_DEBUG "hfcpci_fill_Dfifo count(%d/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 		       count, maxlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	if (count > maxlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 		if (dch->debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 			printk(KERN_DEBUG "hfcpci_fill_Dfifo no fifo mem\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	new_z1 = (le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1) + count) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		(D_FIFO_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	new_f1 = ((df->f1 + 1) & D_FREG_MASK) | (D_FREG_MASK + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	src = dch->tx_skb->data + dch->tx_idx;	/* source pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	dst = df->data + le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	maxlen = D_FIFO_SIZE - le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	/* end fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	if (maxlen > count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 		maxlen = count;	/* limit size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	memcpy(dst, src, maxlen);	/* first copy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	count -= maxlen;	/* remaining bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	if (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 		dst = df->data;	/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 		src += maxlen;	/* new position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 		memcpy(dst, src, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	df->za[new_f1 & D_FREG_MASK].z1 = cpu_to_le16(new_z1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	/* for next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	df->za[df->f1 & D_FREG_MASK].z1 = cpu_to_le16(new_z1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	/* new pos actual buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	df->f1 = new_f1;	/* next frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	dch->tx_idx = dch->tx_skb->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736)  * B-channel send routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) hfcpci_fill_fifo(struct bchannel *bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 	struct hfc_pci	*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	int		maxlen, fcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	int		count, new_z1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	struct bzfifo	*bz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	u_char		*bdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	u_char		new_f1, *src, *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	__le16 *z1t, *z2t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	if ((bch->debug & DEBUG_HW_BCHANNEL) && !(bch->debug & DEBUG_HW_BFIFO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 		printk(KERN_DEBUG "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	if ((!bch->tx_skb) || bch->tx_skb->len == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 		if (!test_bit(FLG_FILLEMPTY, &bch->Flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 		    !test_bit(FLG_TRANSPARENT, &bch->Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 		count = HFCPCI_FILLEMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 		count = bch->tx_skb->len - bch->tx_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	if ((bch->nr & 2) && (!hc->hw.bswapped)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 		bz = &((union fifo_area *)(hc->hw.fifos))->b_chans.txbz_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 		bdata = ((union fifo_area *)(hc->hw.fifos))->b_chans.txdat_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 		bz = &((union fifo_area *)(hc->hw.fifos))->b_chans.txbz_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 		bdata = ((union fifo_area *)(hc->hw.fifos))->b_chans.txdat_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	if (test_bit(FLG_TRANSPARENT, &bch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 		z1t = &bz->za[MAX_B_FRAMES].z1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 		z2t = z1t + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 		if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 			printk(KERN_DEBUG "hfcpci_fill_fifo_trans ch(%x) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 			       "cnt(%d) z1(%x) z2(%x)\n", bch->nr, count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 			       le16_to_cpu(*z1t), le16_to_cpu(*z2t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 		fcnt = le16_to_cpu(*z2t) - le16_to_cpu(*z1t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		if (fcnt <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 			fcnt += B_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 		if (test_bit(FLG_FILLEMPTY, &bch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 			/* fcnt contains available bytes in fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 			if (count > fcnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 				count = fcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 			new_z1 = le16_to_cpu(*z1t) + count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 			/* new buffer Position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 			if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 				new_z1 -= B_FIFO_SIZE;	/* buffer wrap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 			dst = bdata + (le16_to_cpu(*z1t) - B_SUB_VAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 			maxlen = (B_FIFO_SIZE + B_SUB_VAL) - le16_to_cpu(*z1t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 			/* end of fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 			if (bch->debug & DEBUG_HW_BFIFO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 				printk(KERN_DEBUG "hfcpci_FFt fillempty "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 				       "fcnt(%d) maxl(%d) nz1(%x) dst(%p)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 				       fcnt, maxlen, new_z1, dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 			if (maxlen > count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 				maxlen = count;		/* limit size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 			memset(dst, bch->fill[0], maxlen); /* first copy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 			count -= maxlen;		/* remaining bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 			if (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 				dst = bdata;		/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 				memset(dst, bch->fill[0], count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 			*z1t = cpu_to_le16(new_z1);	/* now send data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		/* fcnt contains available bytes in fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		fcnt = B_FIFO_SIZE - fcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 		/* remaining bytes to send (bytes in fifo) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	next_t_frame:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 		count = bch->tx_skb->len - bch->tx_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 		/* maximum fill shall be poll*2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 		if (count > (poll << 1) - fcnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 			count = (poll << 1) - fcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		if (count <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 		/* data is suitable for fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		new_z1 = le16_to_cpu(*z1t) + count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 		/* new buffer Position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 		if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 			new_z1 -= B_FIFO_SIZE;	/* buffer wrap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 		src = bch->tx_skb->data + bch->tx_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 		/* source pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 		dst = bdata + (le16_to_cpu(*z1t) - B_SUB_VAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 		maxlen = (B_FIFO_SIZE + B_SUB_VAL) - le16_to_cpu(*z1t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 		/* end of fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 		if (bch->debug & DEBUG_HW_BFIFO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 			printk(KERN_DEBUG "hfcpci_FFt fcnt(%d) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 			       "maxl(%d) nz1(%x) dst(%p)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 			       fcnt, maxlen, new_z1, dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 		fcnt += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 		bch->tx_idx += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 		if (maxlen > count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 			maxlen = count;		/* limit size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 		memcpy(dst, src, maxlen);	/* first copy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 		count -= maxlen;	/* remaining bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 		if (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 			dst = bdata;	/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 			src += maxlen;	/* new position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 			memcpy(dst, src, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 		*z1t = cpu_to_le16(new_z1);	/* now send data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 		if (bch->tx_idx < bch->tx_skb->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 		dev_kfree_skb(bch->tx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 		if (get_next_bframe(bch))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 			goto next_t_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 		printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 		       "%s: ch(%x) f1(%d) f2(%d) z1(f1)(%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 		       __func__, bch->nr, bz->f1, bz->f2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 		       bz->za[bz->f1].z1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	fcnt = bz->f1 - bz->f2;	/* frame count actually buffered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	if (fcnt < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 		fcnt += (MAX_B_FRAMES + 1);	/* if wrap around */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	if (fcnt > (MAX_B_FRAMES - 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 		if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 			       "hfcpci_fill_Bfifo more as 14 frames\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	/* now determine free bytes in FIFO buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	maxlen = le16_to_cpu(bz->za[bz->f2].z2) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 		le16_to_cpu(bz->za[bz->f1].z1) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	if (maxlen <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 		maxlen += B_FIFO_SIZE;	/* count now contains available bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 		printk(KERN_DEBUG "hfcpci_fill_fifo ch(%x) count(%d/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 		       bch->nr, count, maxlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	if (maxlen < count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 		if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 			printk(KERN_DEBUG "hfcpci_fill_fifo no fifo mem\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	new_z1 = le16_to_cpu(bz->za[bz->f1].z1) + count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	/* new buffer Position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 		new_z1 -= B_FIFO_SIZE;	/* buffer wrap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	new_f1 = ((bz->f1 + 1) & MAX_B_FRAMES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 	src = bch->tx_skb->data + bch->tx_idx;	/* source pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	dst = bdata + (le16_to_cpu(bz->za[bz->f1].z1) - B_SUB_VAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	maxlen = (B_FIFO_SIZE + B_SUB_VAL) - le16_to_cpu(bz->za[bz->f1].z1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	/* end fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	if (maxlen > count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		maxlen = count;	/* limit size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 	memcpy(dst, src, maxlen);	/* first copy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	count -= maxlen;	/* remaining bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 	if (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 		dst = bdata;	/* start of buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 		src += maxlen;	/* new position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 		memcpy(dst, src, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	bz->za[new_f1].z1 = cpu_to_le16(new_z1);	/* for next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	bz->f1 = new_f1;	/* next frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	dev_kfree_skb(bch->tx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	get_next_bframe(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)  * handle L1 state changes TE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) ph_state_te(struct dchannel *dch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	if (dch->debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 		printk(KERN_DEBUG "%s: TE newstate %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 		       __func__, dch->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 	switch (dch->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 		l1_event(dch->l1, HW_RESET_IND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 		l1_event(dch->l1, HW_DEACT_IND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 	case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 		l1_event(dch->l1, ANYSIGNAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 		l1_event(dch->l1, INFO2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 		l1_event(dch->l1, INFO4_P8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935)  * handle L1 state changes NT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) handle_nt_timer3(struct dchannel *dch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	struct hfc_pci	*hc = dch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	test_and_clear_bit(FLG_HFC_TIMER_T3, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	hc->hw.int_m1 &= ~HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	hc->hw.nt_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	test_and_set_bit(FLG_ACTIVE, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	if (test_bit(HFC_CFG_MASTER, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 		hc->hw.mst_m |= HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	_queue_data(&dch->dev.D, PH_ACTIVATE_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 		    MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) ph_state_nt(struct dchannel *dch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	struct hfc_pci	*hc = dch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	if (dch->debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 		printk(KERN_DEBUG "%s: NT newstate %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 		       __func__, dch->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	switch (dch->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 		if (hc->hw.nt_timer < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 			hc->hw.nt_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 			test_and_clear_bit(FLG_HFC_TIMER_T3, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 			test_and_clear_bit(FLG_HFC_TIMER_T1, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 			hc->hw.int_m1 &= ~HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 			Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 			/* Clear already pending ints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 			(void) Read_hfc(hc, HFCPCI_INT_S1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 			Write_hfc(hc, HFCPCI_STATES, 4 | HFCPCI_LOAD_STATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 			udelay(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 			Write_hfc(hc, HFCPCI_STATES, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 			dch->state = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 		} else if (hc->hw.nt_timer == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 			hc->hw.int_m1 |= HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 			Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 			hc->hw.nt_timer = NT_T1_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 			hc->hw.ctmt &= ~HFCPCI_AUTO_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 			hc->hw.ctmt |= HFCPCI_TIM3_125;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 			Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 				  HFCPCI_CLTIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 			test_and_clear_bit(FLG_HFC_TIMER_T3, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 			test_and_set_bit(FLG_HFC_TIMER_T1, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 			/* allow G2 -> G3 transition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 			Write_hfc(hc, HFCPCI_STATES, 2 | HFCPCI_NT_G2_G3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 			Write_hfc(hc, HFCPCI_STATES, 2 | HFCPCI_NT_G2_G3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 		hc->hw.nt_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 		test_and_clear_bit(FLG_HFC_TIMER_T3, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 		test_and_clear_bit(FLG_HFC_TIMER_T1, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 		hc->hw.int_m1 &= ~HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 		Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 		test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 		hc->hw.mst_m &= ~HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 		Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 		test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 		_queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 			    MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		hc->hw.nt_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 		test_and_clear_bit(FLG_HFC_TIMER_T3, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 		test_and_clear_bit(FLG_HFC_TIMER_T1, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 		hc->hw.int_m1 &= ~HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 		Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 		if (!test_and_set_bit(FLG_HFC_TIMER_T3, &dch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 			if (!test_and_clear_bit(FLG_L2_ACTIVATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 						&dch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 				handle_nt_timer3(dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 			test_and_clear_bit(FLG_HFC_TIMER_T1, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 			hc->hw.int_m1 |= HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 			Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 			hc->hw.nt_timer = NT_T3_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 			hc->hw.ctmt &= ~HFCPCI_AUTO_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 			hc->hw.ctmt |= HFCPCI_TIM3_125;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 			Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 				  HFCPCI_CLTIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) ph_state(struct dchannel *dch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	struct hfc_pci	*hc = dch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	if (hc->hw.protocol == ISDN_P_NT_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 		if (test_bit(FLG_HFC_TIMER_T3, &dch->Flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 		    hc->hw.nt_timer < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 			handle_nt_timer3(dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 			ph_state_nt(dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 		ph_state_te(dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)  * Layer 1 callback function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) hfc_l1callback(struct dchannel *dch, u_int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	struct hfc_pci		*hc = dch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	case INFO3_P8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	case INFO3_P10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 		if (test_bit(HFC_CFG_MASTER, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 			hc->hw.mst_m |= HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 		Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	case HW_RESET_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 		Write_hfc(hc, HFCPCI_STATES, HFCPCI_LOAD_STATE | 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 		/* HFC ST 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 		udelay(6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 		Write_hfc(hc, HFCPCI_STATES, 3);	/* HFC ST 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 		if (test_bit(HFC_CFG_MASTER, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 			hc->hw.mst_m |= HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 		Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 		Write_hfc(hc, HFCPCI_STATES, HFCPCI_ACTIVATE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 			  HFCPCI_DO_ACTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		l1_event(dch->l1, HW_POWERUP_IND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	case HW_DEACT_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 		hc->hw.mst_m &= ~HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 		skb_queue_purge(&dch->squeue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		if (dch->tx_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 			dev_kfree_skb(dch->tx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 			dch->tx_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 		dch->tx_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 		if (dch->rx_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 			dev_kfree_skb(dch->rx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 			dch->rx_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 		if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 			del_timer(&dch->timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	case HW_POWERUP_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 		Write_hfc(hc, HFCPCI_STATES, HFCPCI_DO_ACTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	case PH_ACTIVATE_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		test_and_set_bit(FLG_ACTIVE, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 		_queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 			    GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	case PH_DEACTIVATE_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 		test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 		_queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 			    GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		if (dch->debug & DEBUG_HW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 			printk(KERN_DEBUG "%s: unknown command %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 			       __func__, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)  * Interrupt handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) tx_birq(struct bchannel *bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	if (bch->tx_skb && bch->tx_idx < bch->tx_skb->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		hfcpci_fill_fifo(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		dev_kfree_skb(bch->tx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 		if (get_next_bframe(bch))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 			hfcpci_fill_fifo(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) tx_dirq(struct dchannel *dch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	if (dch->tx_skb && dch->tx_idx < dch->tx_skb->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 		hfcpci_fill_dfifo(dch->hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 		dev_kfree_skb(dch->tx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 		if (get_next_dframe(dch))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 			hfcpci_fill_dfifo(dch->hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) static irqreturn_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) hfcpci_int(int intno, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	struct hfc_pci	*hc = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	u_char		exval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	struct bchannel	*bch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	u_char		val, stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 	spin_lock(&hc->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	if (!(hc->hw.int_m2 & 0x08)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 		spin_unlock(&hc->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 		return IRQ_NONE; /* not initialised */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	stat = Read_hfc(hc, HFCPCI_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	if (HFCPCI_ANYINT & stat) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 		val = Read_hfc(hc, HFCPCI_INT_S1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 		if (hc->dch.debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 			printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 			       "HFC-PCI: stat(%02x) s1(%02x)\n", stat, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 		/* shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 		spin_unlock(&hc->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 	hc->irqcnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	if (hc->dch.debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 		printk(KERN_DEBUG "HFC-PCI irq %x\n", val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	val &= hc->hw.int_m1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	if (val & 0x40) {	/* state machine irq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		exval = Read_hfc(hc, HFCPCI_STATES) & 0xf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 		if (hc->dch.debug & DEBUG_HW_DCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 			printk(KERN_DEBUG "ph_state chg %d->%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 			       hc->dch.state, exval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 		hc->dch.state = exval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 		schedule_event(&hc->dch, FLG_PHCHANGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 		val &= ~0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	if (val & 0x80) {	/* timer irq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 		if (hc->hw.protocol == ISDN_P_NT_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 			if ((--hc->hw.nt_timer) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 				schedule_event(&hc->dch, FLG_PHCHANGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 		val &= ~0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 		Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt | HFCPCI_CLTIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	if (val & 0x08) {	/* B1 rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 		bch = Sel_BCS(hc, hc->hw.bswapped ? 2 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 		if (bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 			main_rec_hfcpci(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 		else if (hc->dch.debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 			printk(KERN_DEBUG "hfcpci spurious 0x08 IRQ\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	if (val & 0x10) {	/* B2 rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 		bch = Sel_BCS(hc, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 		if (bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 			main_rec_hfcpci(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 		else if (hc->dch.debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 			printk(KERN_DEBUG "hfcpci spurious 0x10 IRQ\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	if (val & 0x01) {	/* B1 tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 		bch = Sel_BCS(hc, hc->hw.bswapped ? 2 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 		if (bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 			tx_birq(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 		else if (hc->dch.debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 			printk(KERN_DEBUG "hfcpci spurious 0x01 IRQ\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	if (val & 0x02) {	/* B2 tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 		bch = Sel_BCS(hc, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 		if (bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 			tx_birq(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 		else if (hc->dch.debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 			printk(KERN_DEBUG "hfcpci spurious 0x02 IRQ\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	if (val & 0x20)		/* D rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 		receive_dmsg(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	if (val & 0x04) {	/* D tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 		if (test_and_clear_bit(FLG_BUSY_TIMER, &hc->dch.Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 			del_timer(&hc->dch.timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 		tx_dirq(&hc->dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	spin_unlock(&hc->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)  * timer callback for D-chan busy resolution. Currently no function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) hfcpci_dbusy_timer(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)  * activate/deactivate hardware for selected channels and mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) mode_hfcpci(struct bchannel *bch, int bc, int protocol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	struct hfc_pci	*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	int		fifo2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 	u_char		rx_slot = 0, tx_slot = 0, pcm_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 	if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 		printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 		       "HFCPCI bchannel protocol %x-->%x ch %x-->%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 		       bch->state, protocol, bch->nr, bc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	fifo2 = bc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	pcm_mode = (bc >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	if (pcm_mode) { /* PCM SLOT USE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 		if (!test_bit(HFC_CFG_PCM, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 			printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 			       "%s: pcm channel id without HFC_CFG_PCM\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 			       __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 		rx_slot = (bc >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 		tx_slot = (bc >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 		bc = bc & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	} else if (test_bit(HFC_CFG_PCM, &hc->cfg) && (protocol > ISDN_P_NONE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 		printk(KERN_WARNING "%s: no pcm channel id but HFC_CFG_PCM\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 		       __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	if (hc->chanlimit > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 		hc->hw.bswapped = 0;	/* B1 and B2 normal mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 		hc->hw.sctrl_e &= ~0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 		if (bc & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 			if (protocol != ISDN_P_NONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 				hc->hw.bswapped = 1; /* B1 and B2 exchanged */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 				hc->hw.sctrl_e |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 				hc->hw.bswapped = 0; /* B1 and B2 normal mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 				hc->hw.sctrl_e &= ~0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 			fifo2 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 			hc->hw.bswapped = 0;	/* B1 and B2 normal mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 			hc->hw.sctrl_e &= ~0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	switch (protocol) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	case (-1): /* used for init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 		bch->state = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 		bch->nr = bc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	case (ISDN_P_NONE):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 		if (bch->state == ISDN_P_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 		if (bc & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 			hc->hw.sctrl &= ~SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 			hc->hw.sctrl_r &= ~SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 			hc->hw.sctrl &= ~SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 			hc->hw.sctrl_r &= ~SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 		if (fifo2 & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 			hc->hw.fifo_en &= ~HFCPCI_FIFOEN_B2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 			hc->hw.int_m1 &= ~(HFCPCI_INTS_B2TRANS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 					   HFCPCI_INTS_B2REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 			hc->hw.fifo_en &= ~HFCPCI_FIFOEN_B1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 			hc->hw.int_m1 &= ~(HFCPCI_INTS_B1TRANS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 					   HFCPCI_INTS_B1REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 		if (bch->nr & 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 			hc->hw.cirm &= 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 			hc->hw.cirm &= 0xbf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 		bch->state = ISDN_P_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 		bch->nr = bc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 		test_and_clear_bit(FLG_HDLC, &bch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 		test_and_clear_bit(FLG_TRANSPARENT, &bch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	case (ISDN_P_B_RAW):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		bch->state = protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 		bch->nr = bc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 		hfcpci_clear_fifo_rx(hc, (fifo2 & 2) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 		hfcpci_clear_fifo_tx(hc, (fifo2 & 2) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 		if (bc & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 			hc->hw.sctrl |= SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 			hc->hw.sctrl_r |= SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 			hc->hw.cirm |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 			hc->hw.sctrl |= SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 			hc->hw.sctrl_r |= SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 			hc->hw.cirm |= 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 		if (fifo2 & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 			if (!tics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 				hc->hw.int_m1 |= (HFCPCI_INTS_B2TRANS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 						  HFCPCI_INTS_B2REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 			hc->hw.ctmt |= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 			hc->hw.conn &= ~0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 			if (!tics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 				hc->hw.int_m1 |= (HFCPCI_INTS_B1TRANS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 						  HFCPCI_INTS_B1REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 			hc->hw.ctmt |= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 			hc->hw.conn &= ~0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 		test_and_set_bit(FLG_TRANSPARENT, &bch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	case (ISDN_P_B_HDLC):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 		bch->state = protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 		bch->nr = bc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 		hfcpci_clear_fifo_rx(hc, (fifo2 & 2) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 		hfcpci_clear_fifo_tx(hc, (fifo2 & 2) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 		if (bc & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 			hc->hw.sctrl |= SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 			hc->hw.sctrl_r |= SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 			hc->hw.sctrl |= SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 			hc->hw.sctrl_r |= SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 		if (fifo2 & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 			hc->hw.last_bfifo_cnt[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 			hc->hw.int_m1 |= (HFCPCI_INTS_B2TRANS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 					  HFCPCI_INTS_B2REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 			hc->hw.ctmt &= ~2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 			hc->hw.conn &= ~0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 			hc->hw.last_bfifo_cnt[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 			hc->hw.int_m1 |= (HFCPCI_INTS_B1TRANS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 					  HFCPCI_INTS_B1REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 			hc->hw.ctmt &= ~1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 			hc->hw.conn &= ~0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 		test_and_set_bit(FLG_HDLC, &bch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 		printk(KERN_DEBUG "prot not known %x\n", protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		return -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	if (test_bit(HFC_CFG_PCM, &hc->cfg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 		if ((protocol == ISDN_P_NONE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 		    (protocol == -1)) {	/* init case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 			rx_slot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 			tx_slot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 			if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 				rx_slot |= 0xC0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 				tx_slot |= 0xC0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 				rx_slot |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 				tx_slot |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 		if (bc & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 			hc->hw.conn &= 0xc7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 			hc->hw.conn |= 0x08;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 			printk(KERN_DEBUG "%s: Write_hfc: B2_SSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 			       __func__, tx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 			printk(KERN_DEBUG "%s: Write_hfc: B2_RSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 			       __func__, rx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 			Write_hfc(hc, HFCPCI_B2_SSL, tx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 			Write_hfc(hc, HFCPCI_B2_RSL, rx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 			hc->hw.conn &= 0xf8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 			hc->hw.conn |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 			printk(KERN_DEBUG "%s: Write_hfc: B1_SSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 			       __func__, tx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 			printk(KERN_DEBUG "%s: Write_hfc: B1_RSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 			       __func__, rx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 			Write_hfc(hc, HFCPCI_B1_SSL, tx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 			Write_hfc(hc, HFCPCI_B1_RSL, rx_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 	Write_hfc(hc, HFCPCI_SCTRL_E, hc->hw.sctrl_e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 	Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	Write_hfc(hc, HFCPCI_SCTRL, hc->hw.sctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 	Write_hfc(hc, HFCPCI_SCTRL_R, hc->hw.sctrl_r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 	Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 	Write_hfc(hc, HFCPCI_CIRM, hc->hw.cirm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) set_hfcpci_rxtest(struct bchannel *bch, int protocol, int chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 	struct hfc_pci	*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 	if (bch->debug & DEBUG_HW_BCHANNEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 		printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 		       "HFCPCI bchannel test rx protocol %x-->%x ch %x-->%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 		       bch->state, protocol, bch->nr, chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 	if (bch->nr != chan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 		printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 		       "HFCPCI rxtest wrong channel parameter %x/%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 		       bch->nr, chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	switch (protocol) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 	case (ISDN_P_B_RAW):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 		bch->state = protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 		hfcpci_clear_fifo_rx(hc, (chan & 2) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 		if (chan & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 			hc->hw.sctrl_r |= SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B2RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 			if (!tics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 				hc->hw.int_m1 |= HFCPCI_INTS_B2REC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 			hc->hw.ctmt |= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 			hc->hw.conn &= ~0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 			hc->hw.cirm |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 			hc->hw.sctrl_r |= SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B1RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 			if (!tics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 				hc->hw.int_m1 |= HFCPCI_INTS_B1REC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 			hc->hw.ctmt |= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 			hc->hw.conn &= ~0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 			hc->hw.cirm |= 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	case (ISDN_P_B_HDLC):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 		bch->state = protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 		hfcpci_clear_fifo_rx(hc, (chan & 2) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 		if (chan & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 			hc->hw.sctrl_r |= SCTRL_B2_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 			hc->hw.last_bfifo_cnt[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B2RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 			hc->hw.int_m1 |= HFCPCI_INTS_B2REC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 			hc->hw.ctmt &= ~2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 			hc->hw.conn &= ~0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 			hc->hw.sctrl_r |= SCTRL_B1_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 			hc->hw.last_bfifo_cnt[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 			hc->hw.fifo_en |= HFCPCI_FIFOEN_B1RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 			hc->hw.int_m1 |= HFCPCI_INTS_B1REC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 			hc->hw.ctmt &= ~1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 			hc->hw.conn &= ~0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 		printk(KERN_DEBUG "prot not known %x\n", protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 		return -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	Write_hfc(hc, HFCPCI_SCTRL_R, hc->hw.sctrl_r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) #ifdef REVERSE_BITORDER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	Write_hfc(hc, HFCPCI_CIRM, hc->hw.cirm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) deactivate_bchannel(struct bchannel *bch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 	struct hfc_pci	*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	u_long		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 	spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	mISDN_clear_bchannel(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	mode_hfcpci(bch, bch->nr, ISDN_P_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)  * Layer 1 B-channel hardware access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 	return mISDN_ctrl_bchannel(bch, cq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) hfc_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 	struct bchannel	*bch = container_of(ch, struct bchannel, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 	struct hfc_pci	*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 	int		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	u_long		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	if (bch->debug & DEBUG_HW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 		printk(KERN_DEBUG "%s: cmd:%x %p\n", __func__, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 	case HW_TESTRX_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 		ret = set_hfcpci_rxtest(bch, ISDN_P_B_RAW, (int)(long)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 	case HW_TESTRX_HDLC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 		ret = set_hfcpci_rxtest(bch, ISDN_P_B_HDLC, (int)(long)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 	case HW_TESTRX_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 		mode_hfcpci(bch, bch->nr, ISDN_P_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 	case CLOSE_CHANNEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 		test_and_clear_bit(FLG_OPEN, &bch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 		deactivate_bchannel(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 		ch->protocol = ISDN_P_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 		ch->peer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 		module_put(THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 	case CONTROL_CHANNEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 		ret = channel_bctrl(bch, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 		printk(KERN_WARNING "%s: unknown prim(%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 		       __func__, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)  * Layer2 -> Layer 1 Dchannel data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) hfcpci_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 	struct mISDNdevice	*dev = container_of(ch, struct mISDNdevice, D);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 	struct dchannel		*dch = container_of(dev, struct dchannel, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 	struct hfc_pci		*hc = dch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 	int			ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 	struct mISDNhead	*hh = mISDN_HEAD_P(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 	unsigned int		id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 	u_long			flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 	switch (hh->prim) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 	case PH_DATA_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 		ret = dchannel_senddata(dch, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 		if (ret > 0) { /* direct TX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 			id = hh->id; /* skb can be freed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 			hfcpci_fill_dfifo(dch->hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 			spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 			queue_ch_frame(ch, PH_DATA_CNF, id, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 			spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	case PH_ACTIVATE_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 		if (hc->hw.protocol == ISDN_P_NT_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 			if (test_bit(HFC_CFG_MASTER, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 				hc->hw.mst_m |= HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 			Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 			if (test_bit(FLG_ACTIVE, &dch->Flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 				spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 				_queue_data(&dch->dev.D, PH_ACTIVATE_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 					    MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 			test_and_set_bit(FLG_L2_ACTIVATED, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 			Write_hfc(hc, HFCPCI_STATES, HFCPCI_ACTIVATE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 				  HFCPCI_DO_ACTION | 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 			ret = l1_event(dch->l1, hh->prim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	case PH_DEACTIVATE_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 		test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 		if (hc->hw.protocol == ISDN_P_NT_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 			/* prepare deactivation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 			Write_hfc(hc, HFCPCI_STATES, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 			skb_queue_purge(&dch->squeue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 			if (dch->tx_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 				dev_kfree_skb(dch->tx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 				dch->tx_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 			dch->tx_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 			if (dch->rx_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 				dev_kfree_skb(dch->rx_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 				dch->rx_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 			test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 			if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 				del_timer(&dch->timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) #ifdef FIXME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 			if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 				dchannel_sched_event(&hc->dch, D_CLEARBUSY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 			hc->hw.mst_m &= ~HFCPCI_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 			Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 			ret = l1_event(dch->l1, hh->prim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 		dev_kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)  * Layer2 -> Layer 1 Bchannel data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) hfcpci_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 	struct bchannel		*bch = container_of(ch, struct bchannel, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 	struct hfc_pci		*hc = bch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 	int			ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) 	struct mISDNhead	*hh = mISDN_HEAD_P(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 	unsigned long		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) 	switch (hh->prim) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 	case PH_DATA_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 		ret = bchannel_senddata(bch, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 		if (ret > 0) { /* direct TX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 			hfcpci_fill_fifo(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	case PH_ACTIVATE_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 		if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 			ret = mode_hfcpci(bch, bch->nr, ch->protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 		if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 			_queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 				    NULL, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 	case PH_DEACTIVATE_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 		deactivate_bchannel(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 		_queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 			    NULL, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 		dev_kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699)  * called for card init message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) inithfcpci(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 	printk(KERN_DEBUG "inithfcpci: entered\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	timer_setup(&hc->dch.timer, hfcpci_dbusy_timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 	hc->chanlimit = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 	mode_hfcpci(&hc->bch[0], 1, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) 	mode_hfcpci(&hc->bch[1], 2, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) init_card(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 	int	cnt = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) 	u_long	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 	printk(KERN_DEBUG "init_card: entered\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 	spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 	disable_hwirq(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) 	spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 	if (request_irq(hc->irq, hfcpci_int, IRQF_SHARED, "HFC PCI", hc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) 		printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) 		       "mISDN: couldn't get interrupt %d\n", hc->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 	spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) 	reset_hfcpci(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 	while (cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 		inithfcpci(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 		 * Finally enable IRQ output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 		 * this is only allowed, if an IRQ routine is already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) 		 * established for this HFC, so don't do that earlier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 		enable_hwirq(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 		spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 		/* Timeout 80ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 		set_current_state(TASK_UNINTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 		schedule_timeout((80 * HZ) / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 		printk(KERN_INFO "HFC PCI: IRQ %d count %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 		       hc->irq, hc->irqcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 		/* now switch timer interrupt off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 		spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 		hc->hw.int_m1 &= ~HFCPCI_INTS_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 		Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 		/* reinit mode reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 		Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 		if (!hc->irqcnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 			printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 			       "HFC PCI: IRQ(%d) getting no interrupts "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 			       "during init %d\n", hc->irq, 4 - cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 			if (cnt == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 			else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 				reset_hfcpci(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 				cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 			spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 			hc->initdone = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 	disable_hwirq(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 	spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) 	free_irq(hc->irq, hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 	return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 	int	ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) 	u_char	slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 	switch (cq->op) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 	case MISDN_CTRL_GETOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) 		cq->op = MISDN_CTRL_LOOP | MISDN_CTRL_CONNECT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 			 MISDN_CTRL_DISCONNECT | MISDN_CTRL_L1_TIMER3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 	case MISDN_CTRL_LOOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 		/* channel 0 disabled loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 		if (cq->channel < 0 || cq->channel > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 			ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 		if (cq->channel & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 			if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 				slot = 0xC0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 				slot = 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 			printk(KERN_DEBUG "%s: Write_hfc: B1_SSL/RSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 			       __func__, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 			Write_hfc(hc, HFCPCI_B1_SSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 			Write_hfc(hc, HFCPCI_B1_RSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 			hc->hw.conn = (hc->hw.conn & ~7) | 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 			Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 		if (cq->channel & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 			if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 				slot = 0xC1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 				slot = 0x81;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 			printk(KERN_DEBUG "%s: Write_hfc: B2_SSL/RSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 			       __func__, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 			Write_hfc(hc, HFCPCI_B2_SSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 			Write_hfc(hc, HFCPCI_B2_RSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 			hc->hw.conn = (hc->hw.conn & ~0x38) | 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 			Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 		if (cq->channel & 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 			hc->hw.trm |= 0x80;	/* enable IOM-loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 			hc->hw.conn = (hc->hw.conn & ~0x3f) | 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 			Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 			hc->hw.trm &= 0x7f;	/* disable IOM-loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 		Write_hfc(hc, HFCPCI_TRM, hc->hw.trm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 	case MISDN_CTRL_CONNECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 		if (cq->channel == cq->p1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 			ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 		if (cq->channel < 1 || cq->channel > 2 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 		    cq->p1 < 1 || cq->p1 > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 			ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 		if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 			slot = 0xC0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 			slot = 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 		printk(KERN_DEBUG "%s: Write_hfc: B1_SSL/RSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 		       __func__, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 		Write_hfc(hc, HFCPCI_B1_SSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 		Write_hfc(hc, HFCPCI_B2_RSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 		if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 			slot = 0xC1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 			slot = 0x81;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 		printk(KERN_DEBUG "%s: Write_hfc: B2_SSL/RSL 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 		       __func__, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 		Write_hfc(hc, HFCPCI_B2_SSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 		Write_hfc(hc, HFCPCI_B1_RSL, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 		hc->hw.conn = (hc->hw.conn & ~0x3f) | 0x36;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 		Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 		hc->hw.trm |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 		Write_hfc(hc, HFCPCI_TRM, hc->hw.trm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 	case MISDN_CTRL_DISCONNECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 		hc->hw.conn = (hc->hw.conn & ~0x3f) | 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 		Write_hfc(hc, HFCPCI_CONNECT, hc->hw.conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 		hc->hw.trm &= 0x7f;	/* disable IOM-loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 	case MISDN_CTRL_L1_TIMER3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 		ret = l1_event(hc->dch.l1, HW_TIMER3_VALUE | (cq->p1 & 0xff));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 		printk(KERN_WARNING "%s: unknown Op %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 		       __func__, cq->op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) open_dchannel(struct hfc_pci *hc, struct mISDNchannel *ch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 	      struct channel_req *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 	if (debug & DEBUG_HW_OPEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) 		printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 		       hc->dch.dev.id, __builtin_return_address(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 	if (rq->protocol == ISDN_P_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 	if (rq->adr.channel == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 		/* TODO: E-Channel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 	if (!hc->initdone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		if (rq->protocol == ISDN_P_TE_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 			err = create_l1(&hc->dch, hfc_l1callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 			if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 				return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 		hc->hw.protocol = rq->protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 		ch->protocol = rq->protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 		err = init_card(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) 		if (rq->protocol != ch->protocol) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) 			if (hc->hw.protocol == ISDN_P_TE_S0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) 				l1_event(hc->dch.l1, CLOSE_CHANNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) 			if (rq->protocol == ISDN_P_TE_S0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 				err = create_l1(&hc->dch, hfc_l1callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) 				if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 					return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) 			hc->hw.protocol = rq->protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 			ch->protocol = rq->protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 			hfcpci_setmode(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 	if (((ch->protocol == ISDN_P_NT_S0) && (hc->dch.state == 3)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) 	    ((ch->protocol == ISDN_P_TE_S0) && (hc->dch.state == 7))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 		_queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) 			    0, NULL, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) 	rq->ch = ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 	if (!try_module_get(THIS_MODULE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 		printk(KERN_WARNING "%s:cannot get module\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) open_bchannel(struct hfc_pci *hc, struct channel_req *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 	struct bchannel		*bch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 	if (rq->adr.channel == 0 || rq->adr.channel > 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 	if (rq->protocol == ISDN_P_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 	bch = &hc->bch[rq->adr.channel - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 	if (test_and_set_bit(FLG_OPEN, &bch->Flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 		return -EBUSY; /* b-channel can be only open once */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 	bch->ch.protocol = rq->protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 	rq->ch = &bch->ch; /* TODO: E-channel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 	if (!try_module_get(THIS_MODULE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 		printk(KERN_WARNING "%s:cannot get module\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)  * device control function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 	struct mISDNdevice	*dev = container_of(ch, struct mISDNdevice, D);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 	struct dchannel		*dch = container_of(dev, struct dchannel, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 	struct hfc_pci		*hc = dch->hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 	struct channel_req	*rq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 	int			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 	if (dch->debug & DEBUG_HW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) 		printk(KERN_DEBUG "%s: cmd:%x %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) 		       __func__, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 	case OPEN_CHANNEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 		rq = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 		if ((rq->protocol == ISDN_P_TE_S0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 		    (rq->protocol == ISDN_P_NT_S0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 			err = open_dchannel(hc, ch, rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 			err = open_bchannel(hc, rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 	case CLOSE_CHANNEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) 		if (debug & DEBUG_HW_OPEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) 			printk(KERN_DEBUG "%s: dev(%d) close from %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) 			       __func__, hc->dch.dev.id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) 			       __builtin_return_address(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) 		module_put(THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) 	case CONTROL_CHANNEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 		err = channel_ctrl(hc, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 		if (dch->debug & DEBUG_HW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 			printk(KERN_DEBUG "%s: unknown command %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 			       __func__, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) setup_hw(struct hfc_pci *hc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 	void	*buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 	printk(KERN_INFO "mISDN: HFC-PCI driver %s\n", hfcpci_revision);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 	hc->hw.cirm = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) 	hc->dch.state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 	pci_set_master(hc->pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) 	if (!hc->irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) 		printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 	hc->hw.pci_io =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 		(char __iomem *)(unsigned long)hc->pdev->resource[1].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 	if (!hc->hw.pci_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 		printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 	/* Allocate memory for FIFOS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) 	/* the memory needs to be on a 32k boundary within the first 4G */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 	if (dma_set_mask(&hc->pdev->dev, 0xFFFF8000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 		printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 		       "HFC-PCI: No usable DMA configuration!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 	buffer = dma_alloc_coherent(&hc->pdev->dev, 0x8000, &hc->hw.dmahandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 				    GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 	/* We silently assume the address is okay if nonzero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 	if (!buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 		printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 		       "HFC-PCI: Error allocating memory for FIFO!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 	hc->hw.fifos = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 	pci_write_config_dword(hc->pdev, 0x80, hc->hw.dmahandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) 	hc->hw.pci_io = ioremap((ulong) hc->hw.pci_io, 256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 	if (unlikely(!hc->hw.pci_io)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 		printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 		       "HFC-PCI: Error in ioremap for PCI!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 		dma_free_coherent(&hc->pdev->dev, 0x8000, hc->hw.fifos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 				  hc->hw.dmahandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 	printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 	       "HFC-PCI: defined at mem %#lx fifo %p(%pad) IRQ %d HZ %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) 	       (u_long) hc->hw.pci_io, hc->hw.fifos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 	       &hc->hw.dmahandle, hc->irq, HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 	/* enable memory mapped ports, disable busmaster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 	pci_write_config_word(hc->pdev, PCI_COMMAND, PCI_ENA_MEMIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 	hc->hw.int_m2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 	disable_hwirq(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 	hc->hw.int_m1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 	Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 	/* At this point the needed PCI config is done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 	/* fifos are still not enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 	timer_setup(&hc->hw.timer, hfcpci_Timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 	/* default PCM master */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 	test_and_set_bit(HFC_CFG_MASTER, &hc->cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) release_card(struct hfc_pci *hc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 	u_long	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 	spin_lock_irqsave(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 	hc->hw.int_m2 = 0; /* interrupt output off ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 	disable_hwirq(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 	mode_hfcpci(&hc->bch[0], 1, ISDN_P_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 	mode_hfcpci(&hc->bch[1], 2, ISDN_P_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 	if (hc->dch.timer.function != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 		del_timer(&hc->dch.timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 		hc->dch.timer.function = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 	spin_unlock_irqrestore(&hc->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 	if (hc->hw.protocol == ISDN_P_TE_S0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 		l1_event(hc->dch.l1, CLOSE_CHANNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 	if (hc->initdone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 		free_irq(hc->irq, hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 	release_io_hfcpci(hc); /* must release after free_irq! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 	mISDN_unregister_device(&hc->dch.dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 	mISDN_freebchannel(&hc->bch[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 	mISDN_freebchannel(&hc->bch[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) 	mISDN_freedchannel(&hc->dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 	pci_set_drvdata(hc->pdev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) 	kfree(hc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) setup_card(struct hfc_pci *card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) 	int		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 	u_int		i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 	char		name[MISDN_MAX_IDLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) 	card->dch.debug = debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) 	spin_lock_init(&card->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 	mISDN_initdchannel(&card->dch, MAX_DFRAME_LEN_L1, ph_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) 	card->dch.hw = card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) 	card->dch.dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 	card->dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) 		(1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 	card->dch.dev.D.send = hfcpci_l2l1D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) 	card->dch.dev.D.ctrl = hfc_dctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) 	card->dch.dev.nrbchan = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 	for (i = 0; i < 2; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 		card->bch[i].nr = i + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 		set_channelmap(i + 1, card->dch.dev.channelmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 		card->bch[i].debug = debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 		mISDN_initbchannel(&card->bch[i], MAX_DATA_MEM, poll >> 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 		card->bch[i].hw = card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 		card->bch[i].ch.send = hfcpci_l2l1B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) 		card->bch[i].ch.ctrl = hfc_bctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 		card->bch[i].ch.nr = i + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 		list_add(&card->bch[i].ch.list, &card->dch.dev.bchannels);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 	err = setup_hw(card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) 	snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-pci.%d", HFC_cnt + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 	err = mISDN_register_device(&card->dch.dev, &card->pdev->dev, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 	HFC_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) 	printk(KERN_INFO "HFC %d cards installed\n", HFC_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) 	mISDN_freebchannel(&card->bch[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 	mISDN_freebchannel(&card->bch[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) 	mISDN_freedchannel(&card->dch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) 	kfree(card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) /* private data in the PCI devices list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) struct _hfc_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 	u_int	subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 	u_int	flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 	char	*name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) static const struct _hfc_map hfc_map[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 	{HFC_CCD_2BD0, 0, "CCD/Billion/Asuscom 2BD0"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 	{HFC_CCD_B000, 0, "Billion B000"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 	{HFC_CCD_B006, 0, "Billion B006"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 	{HFC_CCD_B007, 0, "Billion B007"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 	{HFC_CCD_B008, 0, "Billion B008"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 	{HFC_CCD_B009, 0, "Billion B009"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 	{HFC_CCD_B00A, 0, "Billion B00A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 	{HFC_CCD_B00B, 0, "Billion B00B"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 	{HFC_CCD_B00C, 0, "Billion B00C"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 	{HFC_CCD_B100, 0, "Seyeon B100"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 	{HFC_CCD_B700, 0, "Primux II S0 B700"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 	{HFC_CCD_B701, 0, "Primux II S0 NT B701"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 	{HFC_ABOCOM_2BD1, 0, "Abocom/Magitek 2BD1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 	{HFC_ASUS_0675, 0, "Asuscom/Askey 675"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 	{HFC_BERKOM_TCONCEPT, 0, "German telekom T-Concept"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 	{HFC_BERKOM_A1T, 0, "German telekom A1T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 	{HFC_ANIGMA_MC145575, 0, "Motorola MC145575"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 	{HFC_ZOLTRIX_2BD0, 0, "Zoltrix 2BD0"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 	{HFC_DIGI_DF_M_IOM2_E, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 	 "Digi International DataFire Micro V IOM2 (Europe)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 	{HFC_DIGI_DF_M_E, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 	 "Digi International DataFire Micro V (Europe)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 	{HFC_DIGI_DF_M_IOM2_A, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 	 "Digi International DataFire Micro V IOM2 (North America)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 	{HFC_DIGI_DF_M_A, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 	 "Digi International DataFire Micro V (North America)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 	{HFC_SITECOM_DC105V2, 0, "Sitecom Connectivity DC-105 ISDN TA"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 	{},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) static const struct pci_device_id hfc_ids[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_2BD0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 	  (unsigned long) &hfc_map[0] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 	  (unsigned long) &hfc_map[1] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 	  (unsigned long) &hfc_map[2] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B007),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) 	  (unsigned long) &hfc_map[3] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B008),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 	  (unsigned long) &hfc_map[4] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B009),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 	  (unsigned long) &hfc_map[5] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B00A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 	  (unsigned long) &hfc_map[6] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B00B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 	  (unsigned long) &hfc_map[7] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B00C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) 	  (unsigned long) &hfc_map[8] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 	  (unsigned long) &hfc_map[9] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B700),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 	  (unsigned long) &hfc_map[10] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 	{ PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B701),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 	  (unsigned long) &hfc_map[11] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 	{ PCI_VDEVICE(ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 	  (unsigned long) &hfc_map[12] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) 	{ PCI_VDEVICE(ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 	  (unsigned long) &hfc_map[13] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) 	{ PCI_VDEVICE(BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) 	  (unsigned long) &hfc_map[14] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	{ PCI_VDEVICE(BERKOM, PCI_DEVICE_ID_BERKOM_A1T),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 	  (unsigned long) &hfc_map[15] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) 	{ PCI_VDEVICE(ANIGMA, PCI_DEVICE_ID_ANIGMA_MC145575),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 	  (unsigned long) &hfc_map[16] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) 	{ PCI_VDEVICE(ZOLTRIX, PCI_DEVICE_ID_ZOLTRIX_2BD0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 	  (unsigned long) &hfc_map[17] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	{ PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 	  (unsigned long) &hfc_map[18] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 	{ PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_E),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 	  (unsigned long) &hfc_map[19] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) 	{ PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 	  (unsigned long) &hfc_map[20] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 	{ PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 	  (unsigned long) &hfc_map[21] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 	{ PCI_VDEVICE(SITECOM, PCI_DEVICE_ID_SITECOM_DC105V2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 	  (unsigned long) &hfc_map[22] },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 	{},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) hfc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 	int		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 	struct hfc_pci	*card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 	struct _hfc_map	*m = (struct _hfc_map *)ent->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 	card = kzalloc(sizeof(struct hfc_pci), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 	if (!card) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 		printk(KERN_ERR "No kmem for HFC card\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 	card->pdev = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 	card->subtype = m->subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) 	err = pci_enable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) 		kfree(card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 	printk(KERN_INFO "mISDN_hfcpci: found adapter %s at %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 	       m->name, pci_name(pdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 	card->irq = pdev->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 	pci_set_drvdata(pdev, card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 	err = setup_card(card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 		pci_set_drvdata(pdev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) hfc_remove_pci(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) 	struct hfc_pci	*card = pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) 	if (card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) 		release_card(card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) 		if (debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) 			printk(KERN_DEBUG "%s: drvdata already removed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 			       __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) static struct pci_driver hfc_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 	.name = "hfcpci",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 	.probe = hfc_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	.remove = hfc_remove_pci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) 	.id_table = hfc_ids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) _hfcpci_softirq(struct device *dev, void *unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 	struct hfc_pci  *hc = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 	struct bchannel *bch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	if (hc == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 	if (hc->hw.int_m2 & HFCPCI_IRQ_ENABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 		spin_lock(&hc->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 		bch = Sel_BCS(hc, hc->hw.bswapped ? 2 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) 		if (bch && bch->state == ISDN_P_B_RAW) { /* B1 rx&tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 			main_rec_hfcpci(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 			tx_birq(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 		bch = Sel_BCS(hc, hc->hw.bswapped ? 1 : 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 		if (bch && bch->state == ISDN_P_B_RAW) { /* B2 rx&tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 			main_rec_hfcpci(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 			tx_birq(bch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 		spin_unlock(&hc->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) hfcpci_softirq(struct timer_list *unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) 	WARN_ON_ONCE(driver_for_each_device(&hfc_driver.driver, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) 				      _hfcpci_softirq) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 	/* if next event would be in the past ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 	if ((s32)(hfc_jiffies + tics - jiffies) <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 		hfc_jiffies = jiffies + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 		hfc_jiffies += tics;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 	hfc_tl.expires = hfc_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 	add_timer(&hfc_tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) HFC_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) 	int		err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 	if (!poll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 		poll = HFCPCI_BTRANS_THRESHOLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 	if (poll != HFCPCI_BTRANS_THRESHOLD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 		tics = (poll * HZ) / 8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 		if (tics < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 			tics = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 		poll = (tics * 8000) / HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 		if (poll > 256 || poll < 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 			printk(KERN_ERR "%s: Wrong poll value %d not in range "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 			       "of 8..256.\n", __func__, poll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 	if (poll != HFCPCI_BTRANS_THRESHOLD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) 		printk(KERN_INFO "%s: Using alternative poll value of %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 		       __func__, poll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 		timer_setup(&hfc_tl, hfcpci_softirq, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) 		hfc_tl.expires = jiffies + tics;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 		hfc_jiffies = hfc_tl.expires;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 		add_timer(&hfc_tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 		tics = 0; /* indicate the use of controller's timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) 	err = pci_register_driver(&hfc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 		if (timer_pending(&hfc_tl))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 			del_timer(&hfc_tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) static void __exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) HFC_cleanup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) 	if (timer_pending(&hfc_tl))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 		del_timer_sync(&hfc_tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) 	pci_unregister_driver(&hfc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) module_init(HFC_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) module_exit(HFC_cleanup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) MODULE_DEVICE_TABLE(pci, hfc_ids);