• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /********************************************************************
2  Filename:      via-ircc.c
3  Version:       1.0
4  Description:   Driver for the VIA VT8231/VT8233 IrDA chipsets
5  Author:        VIA Technologies,inc
6  Date  :	08/06/2003
7 
8 Copyright (c) 1998-2003 VIA Technologies, Inc.
9 
10 This program is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free Software
12 Foundation; either version 2, or (at your option) any later version.
13 
14 This program is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTIES OR REPRESENTATIONS; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License along with
20 this program; if not, see <http://www.gnu.org/licenses/>.
21 
22 F01 Oct/02/02: Modify code for V0.11(move out back to back transfer)
23 F02 Oct/28/02: Add SB device ID for 3147 and 3177.
24  Comment :
25        jul/09/2002 : only implement two kind of dongle currently.
26        Oct/02/2002 : work on VT8231 and VT8233 .
27        Aug/06/2003 : change driver format to pci driver .
28 
29 2004-02-16: <sda@bdit.de>
30 - Removed unneeded 'legacy' pci stuff.
31 - Make sure SIR mode is set (hw_init()) before calling mode-dependent stuff.
32 - On speed change from core, don't send SIR frame with new speed.
33   Use current speed and change speeds later.
34 - Make module-param dongle_id actually work.
35 - New dongle_id 17 (0x11): TDFS4500. Single-ended SIR only.
36   Tested with home-grown PCB on EPIA boards.
37 - Code cleanup.
38 
39  ********************************************************************/
40 #include <linux/module.h>
41 #include <linux/kernel.h>
42 #include <linux/types.h>
43 #include <linux/skbuff.h>
44 #include <linux/netdevice.h>
45 #include <linux/ioport.h>
46 #include <linux/delay.h>
47 #include <linux/init.h>
48 #include <linux/interrupt.h>
49 #include <linux/rtnetlink.h>
50 #include <linux/pci.h>
51 #include <linux/dma-mapping.h>
52 #include <linux/gfp.h>
53 
54 #include <asm/io.h>
55 #include <asm/dma.h>
56 #include <asm/byteorder.h>
57 
58 #include <linux/pm.h>
59 
60 #include <net/irda/wrapper.h>
61 #include <net/irda/irda.h>
62 #include <net/irda/irda_device.h>
63 
64 #include "via-ircc.h"
65 
66 #define VIA_MODULE_NAME "via-ircc"
67 #define CHIP_IO_EXTENT 0x40
68 
69 static char *driver_name = VIA_MODULE_NAME;
70 
71 /* Module parameters */
72 static int qos_mtt_bits = 0x07;	/* 1 ms or more */
73 static int dongle_id = 0;	/* default: probe */
74 
75 /* We can't guess the type of connected dongle, user *must* supply it. */
76 module_param(dongle_id, int, 0);
77 
78 /* Some prototypes */
79 static int via_ircc_open(struct pci_dev *pdev, chipio_t *info,
80 			 unsigned int id);
81 static int via_ircc_dma_receive(struct via_ircc_cb *self);
82 static int via_ircc_dma_receive_complete(struct via_ircc_cb *self,
83 					 int iobase);
84 static netdev_tx_t via_ircc_hard_xmit_sir(struct sk_buff *skb,
85 						struct net_device *dev);
86 static netdev_tx_t via_ircc_hard_xmit_fir(struct sk_buff *skb,
87 						struct net_device *dev);
88 static void via_hw_init(struct via_ircc_cb *self);
89 static void via_ircc_change_speed(struct via_ircc_cb *self, __u32 baud);
90 static irqreturn_t via_ircc_interrupt(int irq, void *dev_id);
91 static int via_ircc_is_receiving(struct via_ircc_cb *self);
92 static int via_ircc_read_dongle_id(int iobase);
93 
94 static int via_ircc_net_open(struct net_device *dev);
95 static int via_ircc_net_close(struct net_device *dev);
96 static int via_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq,
97 			      int cmd);
98 static void via_ircc_change_dongle_speed(int iobase, int speed,
99 					 int dongle_id);
100 static int RxTimerHandler(struct via_ircc_cb *self, int iobase);
101 static void hwreset(struct via_ircc_cb *self);
102 static int via_ircc_dma_xmit(struct via_ircc_cb *self, u16 iobase);
103 static int upload_rxdata(struct via_ircc_cb *self, int iobase);
104 static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id);
105 static void via_remove_one(struct pci_dev *pdev);
106 
107 /* FIXME : Should use udelay() instead, even if we are x86 only - Jean II */
iodelay(int udelay)108 static void iodelay(int udelay)
109 {
110 	u8 data;
111 	int i;
112 
113 	for (i = 0; i < udelay; i++) {
114 		data = inb(0x80);
115 	}
116 }
117 
118 static const struct pci_device_id via_pci_tbl[] = {
119 	{ PCI_VENDOR_ID_VIA, 0x8231, PCI_ANY_ID, PCI_ANY_ID,0,0,0 },
120 	{ PCI_VENDOR_ID_VIA, 0x3109, PCI_ANY_ID, PCI_ANY_ID,0,0,1 },
121 	{ PCI_VENDOR_ID_VIA, 0x3074, PCI_ANY_ID, PCI_ANY_ID,0,0,2 },
122 	{ PCI_VENDOR_ID_VIA, 0x3147, PCI_ANY_ID, PCI_ANY_ID,0,0,3 },
123 	{ PCI_VENDOR_ID_VIA, 0x3177, PCI_ANY_ID, PCI_ANY_ID,0,0,4 },
124 	{ 0, }
125 };
126 
127 MODULE_DEVICE_TABLE(pci,via_pci_tbl);
128 
129 
130 static struct pci_driver via_driver = {
131 	.name		= VIA_MODULE_NAME,
132 	.id_table	= via_pci_tbl,
133 	.probe		= via_init_one,
134 	.remove		= via_remove_one,
135 };
136 
137 
138 /*
139  * Function via_ircc_init ()
140  *
141  *    Initialize chip. Just find out chip type and resource.
142  */
via_ircc_init(void)143 static int __init via_ircc_init(void)
144 {
145 	int rc;
146 
147 	IRDA_DEBUG(3, "%s()\n", __func__);
148 
149 	rc = pci_register_driver(&via_driver);
150 	if (rc < 0) {
151 		IRDA_DEBUG(0, "%s(): error rc = %d, returning  -ENODEV...\n",
152 			   __func__, rc);
153 		return -ENODEV;
154 	}
155 	return 0;
156 }
157 
via_init_one(struct pci_dev * pcidev,const struct pci_device_id * id)158 static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
159 {
160 	int rc;
161         u8 temp,oldPCI_40,oldPCI_44,bTmp,bTmp1;
162 	u16 Chipset,FirDRQ1,FirDRQ0,FirIRQ,FirIOBase;
163 	chipio_t info;
164 
165 	IRDA_DEBUG(2, "%s(): Device ID=(0X%X)\n", __func__, id->device);
166 
167 	rc = pci_enable_device (pcidev);
168 	if (rc) {
169 		IRDA_DEBUG(0, "%s(): error rc = %d\n", __func__, rc);
170 		return -ENODEV;
171 	}
172 
173 	// South Bridge exist
174         if ( ReadLPCReg(0x20) != 0x3C )
175 		Chipset=0x3096;
176 	else
177 		Chipset=0x3076;
178 
179 	if (Chipset==0x3076) {
180 		IRDA_DEBUG(2, "%s(): Chipset = 3076\n", __func__);
181 
182 		WriteLPCReg(7,0x0c );
183 		temp=ReadLPCReg(0x30);//check if BIOS Enable Fir
184 		if((temp&0x01)==1) {   // BIOS close or no FIR
185 			WriteLPCReg(0x1d, 0x82 );
186 			WriteLPCReg(0x23,0x18);
187 			temp=ReadLPCReg(0xF0);
188 			if((temp&0x01)==0) {
189 				temp=(ReadLPCReg(0x74)&0x03);    //DMA
190 				FirDRQ0=temp + 4;
191 				temp=(ReadLPCReg(0x74)&0x0C) >> 2;
192 				FirDRQ1=temp + 4;
193 			} else {
194 				temp=(ReadLPCReg(0x74)&0x0C) >> 2;    //DMA
195 				FirDRQ0=temp + 4;
196 				FirDRQ1=FirDRQ0;
197 			}
198 			FirIRQ=(ReadLPCReg(0x70)&0x0f);		//IRQ
199 			FirIOBase=ReadLPCReg(0x60 ) << 8;	//IO Space :high byte
200 			FirIOBase=FirIOBase| ReadLPCReg(0x61) ;	//low byte
201 			FirIOBase=FirIOBase  ;
202 			info.fir_base=FirIOBase;
203 			info.irq=FirIRQ;
204 			info.dma=FirDRQ1;
205 			info.dma2=FirDRQ0;
206 			pci_read_config_byte(pcidev,0x40,&bTmp);
207 			pci_write_config_byte(pcidev,0x40,((bTmp | 0x08) & 0xfe));
208 			pci_read_config_byte(pcidev,0x42,&bTmp);
209 			pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0));
210 			pci_write_config_byte(pcidev,0x5a,0xc0);
211 			WriteLPCReg(0x28, 0x70 );
212 			rc = via_ircc_open(pcidev, &info, 0x3076);
213 		} else
214 			rc = -ENODEV; //IR not turn on
215 	} else { //Not VT1211
216 		IRDA_DEBUG(2, "%s(): Chipset = 3096\n", __func__);
217 
218 		pci_read_config_byte(pcidev,0x67,&bTmp);//check if BIOS Enable Fir
219 		if((bTmp&0x01)==1) {  // BIOS enable FIR
220 			//Enable Double DMA clock
221 			pci_read_config_byte(pcidev,0x42,&oldPCI_40);
222 			pci_write_config_byte(pcidev,0x42,oldPCI_40 | 0x80);
223 			pci_read_config_byte(pcidev,0x40,&oldPCI_40);
224 			pci_write_config_byte(pcidev,0x40,oldPCI_40 & 0xf7);
225 			pci_read_config_byte(pcidev,0x44,&oldPCI_44);
226 			pci_write_config_byte(pcidev,0x44,0x4e);
227   //---------- read configuration from Function0 of south bridge
228 			if((bTmp&0x02)==0) {
229 				pci_read_config_byte(pcidev,0x44,&bTmp1); //DMA
230 				FirDRQ0 = (bTmp1 & 0x30) >> 4;
231 				pci_read_config_byte(pcidev,0x44,&bTmp1);
232 				FirDRQ1 = (bTmp1 & 0xc0) >> 6;
233 			} else  {
234 				pci_read_config_byte(pcidev,0x44,&bTmp1);    //DMA
235 				FirDRQ0 = (bTmp1 & 0x30) >> 4 ;
236 				FirDRQ1=0;
237 			}
238 			pci_read_config_byte(pcidev,0x47,&bTmp1);  //IRQ
239 			FirIRQ = bTmp1 & 0x0f;
240 
241 			pci_read_config_byte(pcidev,0x69,&bTmp);
242 			FirIOBase = bTmp << 8;//hight byte
243 			pci_read_config_byte(pcidev,0x68,&bTmp);
244 			FirIOBase = (FirIOBase | bTmp ) & 0xfff0;
245   //-------------------------
246 			info.fir_base=FirIOBase;
247 			info.irq=FirIRQ;
248 			info.dma=FirDRQ1;
249 			info.dma2=FirDRQ0;
250 			rc = via_ircc_open(pcidev, &info, 0x3096);
251 		} else
252 			rc = -ENODEV; //IR not turn on !!!!!
253 	}//Not VT1211
254 
255 	IRDA_DEBUG(2, "%s(): End - rc = %d\n", __func__, rc);
256 	return rc;
257 }
258 
via_ircc_cleanup(void)259 static void __exit via_ircc_cleanup(void)
260 {
261 	IRDA_DEBUG(3, "%s()\n", __func__);
262 
263 	/* Cleanup all instances of the driver */
264 	pci_unregister_driver (&via_driver);
265 }
266 
267 static const struct net_device_ops via_ircc_sir_ops = {
268 	.ndo_start_xmit = via_ircc_hard_xmit_sir,
269 	.ndo_open = via_ircc_net_open,
270 	.ndo_stop = via_ircc_net_close,
271 	.ndo_do_ioctl = via_ircc_net_ioctl,
272 };
273 static const struct net_device_ops via_ircc_fir_ops = {
274 	.ndo_start_xmit = via_ircc_hard_xmit_fir,
275 	.ndo_open = via_ircc_net_open,
276 	.ndo_stop = via_ircc_net_close,
277 	.ndo_do_ioctl = via_ircc_net_ioctl,
278 };
279 
280 /*
281  * Function via_ircc_open(pdev, iobase, irq)
282  *
283  *    Open driver instance
284  *
285  */
via_ircc_open(struct pci_dev * pdev,chipio_t * info,unsigned int id)286 static int via_ircc_open(struct pci_dev *pdev, chipio_t *info, unsigned int id)
287 {
288 	struct net_device *dev;
289 	struct via_ircc_cb *self;
290 	int err;
291 
292 	IRDA_DEBUG(3, "%s()\n", __func__);
293 
294 	/* Allocate new instance of the driver */
295 	dev = alloc_irdadev(sizeof(struct via_ircc_cb));
296 	if (dev == NULL)
297 		return -ENOMEM;
298 
299 	self = netdev_priv(dev);
300 	self->netdev = dev;
301 	spin_lock_init(&self->lock);
302 
303 	pci_set_drvdata(pdev, self);
304 
305 	/* Initialize Resource */
306 	self->io.cfg_base = info->cfg_base;
307 	self->io.fir_base = info->fir_base;
308 	self->io.irq = info->irq;
309 	self->io.fir_ext = CHIP_IO_EXTENT;
310 	self->io.dma = info->dma;
311 	self->io.dma2 = info->dma2;
312 	self->io.fifo_size = 32;
313 	self->chip_id = id;
314 	self->st_fifo.len = 0;
315 	self->RxDataReady = 0;
316 
317 	/* Reserve the ioports that we need */
318 	if (!request_region(self->io.fir_base, self->io.fir_ext, driver_name)) {
319 		IRDA_DEBUG(0, "%s(), can't get iobase of 0x%03x\n",
320 			   __func__, self->io.fir_base);
321 		err = -ENODEV;
322 		goto err_out1;
323 	}
324 
325 	/* Initialize QoS for this device */
326 	irda_init_max_qos_capabilies(&self->qos);
327 
328 	/* Check if user has supplied the dongle id or not */
329 	if (!dongle_id)
330 		dongle_id = via_ircc_read_dongle_id(self->io.fir_base);
331 	self->io.dongle_id = dongle_id;
332 
333 	/* The only value we must override it the baudrate */
334 	/* Maximum speeds and capabilities are dongle-dependent. */
335 	switch( self->io.dongle_id ){
336 	case 0x0d:
337 		self->qos.baud_rate.bits =
338 		    IR_9600 | IR_19200 | IR_38400 | IR_57600 | IR_115200 |
339 		    IR_576000 | IR_1152000 | (IR_4000000 << 8);
340 		break;
341 	default:
342 		self->qos.baud_rate.bits =
343 		    IR_9600 | IR_19200 | IR_38400 | IR_57600 | IR_115200;
344 		break;
345 	}
346 
347 	/* Following was used for testing:
348 	 *
349 	 *   self->qos.baud_rate.bits = IR_9600;
350 	 *
351 	 * Is is no good, as it prohibits (error-prone) speed-changes.
352 	 */
353 
354 	self->qos.min_turn_time.bits = qos_mtt_bits;
355 	irda_qos_bits_to_value(&self->qos);
356 
357 	/* Max DMA buffer size needed = (data_size + 6) * (window_size) + 6; */
358 	self->rx_buff.truesize = 14384 + 2048;
359 	self->tx_buff.truesize = 14384 + 2048;
360 
361 	/* Allocate memory if needed */
362 	self->rx_buff.head =
363 		dma_zalloc_coherent(&pdev->dev, self->rx_buff.truesize,
364 				    &self->rx_buff_dma, GFP_KERNEL);
365 	if (self->rx_buff.head == NULL) {
366 		err = -ENOMEM;
367 		goto err_out2;
368 	}
369 
370 	self->tx_buff.head =
371 		dma_zalloc_coherent(&pdev->dev, self->tx_buff.truesize,
372 				    &self->tx_buff_dma, GFP_KERNEL);
373 	if (self->tx_buff.head == NULL) {
374 		err = -ENOMEM;
375 		goto err_out3;
376 	}
377 
378 	self->rx_buff.in_frame = FALSE;
379 	self->rx_buff.state = OUTSIDE_FRAME;
380 	self->tx_buff.data = self->tx_buff.head;
381 	self->rx_buff.data = self->rx_buff.head;
382 
383 	/* Reset Tx queue info */
384 	self->tx_fifo.len = self->tx_fifo.ptr = self->tx_fifo.free = 0;
385 	self->tx_fifo.tail = self->tx_buff.head;
386 
387 	/* Override the network functions we need to use */
388 	dev->netdev_ops = &via_ircc_sir_ops;
389 
390 	err = register_netdev(dev);
391 	if (err)
392 		goto err_out4;
393 
394 	IRDA_MESSAGE("IrDA: Registered device %s (via-ircc)\n", dev->name);
395 
396 	/* Initialise the hardware..
397 	*/
398 	self->io.speed = 9600;
399 	via_hw_init(self);
400 	return 0;
401  err_out4:
402 	dma_free_coherent(&pdev->dev, self->tx_buff.truesize,
403 			  self->tx_buff.head, self->tx_buff_dma);
404  err_out3:
405 	dma_free_coherent(&pdev->dev, self->rx_buff.truesize,
406 			  self->rx_buff.head, self->rx_buff_dma);
407  err_out2:
408 	release_region(self->io.fir_base, self->io.fir_ext);
409  err_out1:
410 	free_netdev(dev);
411 	return err;
412 }
413 
414 /*
415  * Function via_remove_one(pdev)
416  *
417  *    Close driver instance
418  *
419  */
via_remove_one(struct pci_dev * pdev)420 static void via_remove_one(struct pci_dev *pdev)
421 {
422 	struct via_ircc_cb *self = pci_get_drvdata(pdev);
423 	int iobase;
424 
425 	IRDA_DEBUG(3, "%s()\n", __func__);
426 
427 	iobase = self->io.fir_base;
428 
429 	ResetChip(iobase, 5);	//hardware reset.
430 	/* Remove netdevice */
431 	unregister_netdev(self->netdev);
432 
433 	/* Release the PORT that this driver is using */
434 	IRDA_DEBUG(2, "%s(), Releasing Region %03x\n",
435 		   __func__, self->io.fir_base);
436 	release_region(self->io.fir_base, self->io.fir_ext);
437 	if (self->tx_buff.head)
438 		dma_free_coherent(&pdev->dev, self->tx_buff.truesize,
439 				  self->tx_buff.head, self->tx_buff_dma);
440 	if (self->rx_buff.head)
441 		dma_free_coherent(&pdev->dev, self->rx_buff.truesize,
442 				  self->rx_buff.head, self->rx_buff_dma);
443 
444 	free_netdev(self->netdev);
445 
446 	pci_disable_device(pdev);
447 }
448 
449 /*
450  * Function via_hw_init(self)
451  *
452  *    Returns non-negative on success.
453  *
454  * Formerly via_ircc_setup
455  */
via_hw_init(struct via_ircc_cb * self)456 static void via_hw_init(struct via_ircc_cb *self)
457 {
458 	int iobase = self->io.fir_base;
459 
460 	IRDA_DEBUG(3, "%s()\n", __func__);
461 
462 	SetMaxRxPacketSize(iobase, 0x0fff);	//set to max:4095
463 	// FIFO Init
464 	EnRXFIFOReadyInt(iobase, OFF);
465 	EnRXFIFOHalfLevelInt(iobase, OFF);
466 	EnTXFIFOHalfLevelInt(iobase, OFF);
467 	EnTXFIFOUnderrunEOMInt(iobase, ON);
468 	EnTXFIFOReadyInt(iobase, OFF);
469 	InvertTX(iobase, OFF);
470 	InvertRX(iobase, OFF);
471 
472 	if (ReadLPCReg(0x20) == 0x3c)
473 		WriteLPCReg(0xF0, 0);	// for VT1211
474 	/* Int Init */
475 	EnRXSpecInt(iobase, ON);
476 
477 	/* The following is basically hwreset */
478 	/* If this is the case, why not just call hwreset() ? Jean II */
479 	ResetChip(iobase, 5);
480 	EnableDMA(iobase, OFF);
481 	EnableTX(iobase, OFF);
482 	EnableRX(iobase, OFF);
483 	EnRXDMA(iobase, OFF);
484 	EnTXDMA(iobase, OFF);
485 	RXStart(iobase, OFF);
486 	TXStart(iobase, OFF);
487 	InitCard(iobase);
488 	CommonInit(iobase);
489 	SIRFilter(iobase, ON);
490 	SetSIR(iobase, ON);
491 	CRC16(iobase, ON);
492 	EnTXCRC(iobase, 0);
493 	WriteReg(iobase, I_ST_CT_0, 0x00);
494 	SetBaudRate(iobase, 9600);
495 	SetPulseWidth(iobase, 12);
496 	SetSendPreambleCount(iobase, 0);
497 
498 	self->io.speed = 9600;
499 	self->st_fifo.len = 0;
500 
501 	via_ircc_change_dongle_speed(iobase, self->io.speed,
502 				     self->io.dongle_id);
503 
504 	WriteReg(iobase, I_ST_CT_0, 0x80);
505 }
506 
507 /*
508  * Function via_ircc_read_dongle_id (void)
509  *
510  */
via_ircc_read_dongle_id(int iobase)511 static int via_ircc_read_dongle_id(int iobase)
512 {
513 	IRDA_ERROR("via-ircc: dongle probing not supported, please specify dongle_id module parameter.\n");
514 	return 9;	/* Default to IBM */
515 }
516 
517 /*
518  * Function via_ircc_change_dongle_speed (iobase, speed, dongle_id)
519  *    Change speed of the attach dongle
520  *    only implement two type of dongle currently.
521  */
via_ircc_change_dongle_speed(int iobase,int speed,int dongle_id)522 static void via_ircc_change_dongle_speed(int iobase, int speed,
523 					 int dongle_id)
524 {
525 	u8 mode = 0;
526 
527 	/* speed is unused, as we use IsSIROn()/IsMIROn() */
528 	speed = speed;
529 
530 	IRDA_DEBUG(1, "%s(): change_dongle_speed to %d for 0x%x, %d\n",
531 		   __func__, speed, iobase, dongle_id);
532 
533 	switch (dongle_id) {
534 
535 		/* Note: The dongle_id's listed here are derived from
536 		 * nsc-ircc.c */
537 
538 	case 0x08:		/* HP HSDL-2300, HP HSDL-3600/HSDL-3610 */
539 		UseOneRX(iobase, ON);	// use one RX pin   RX1,RX2
540 		InvertTX(iobase, OFF);
541 		InvertRX(iobase, OFF);
542 
543 		EnRX2(iobase, ON);	//sir to rx2
544 		EnGPIOtoRX2(iobase, OFF);
545 
546 		if (IsSIROn(iobase)) {	//sir
547 			// Mode select Off
548 			SlowIRRXLowActive(iobase, ON);
549 			udelay(1000);
550 			SlowIRRXLowActive(iobase, OFF);
551 		} else {
552 			if (IsMIROn(iobase)) {	//mir
553 				// Mode select On
554 				SlowIRRXLowActive(iobase, OFF);
555 				udelay(20);
556 			} else {	// fir
557 				if (IsFIROn(iobase)) {	//fir
558 					// Mode select On
559 					SlowIRRXLowActive(iobase, OFF);
560 					udelay(20);
561 				}
562 			}
563 		}
564 		break;
565 
566 	case 0x09:		/* IBM31T1100 or Temic TFDS6000/TFDS6500 */
567 		UseOneRX(iobase, ON);	//use ONE RX....RX1
568 		InvertTX(iobase, OFF);
569 		InvertRX(iobase, OFF);	// invert RX pin
570 
571 		EnRX2(iobase, ON);
572 		EnGPIOtoRX2(iobase, OFF);
573 		if (IsSIROn(iobase)) {	//sir
574 			// Mode select On
575 			SlowIRRXLowActive(iobase, ON);
576 			udelay(20);
577 			// Mode select Off
578 			SlowIRRXLowActive(iobase, OFF);
579 		}
580 		if (IsMIROn(iobase)) {	//mir
581 			// Mode select On
582 			SlowIRRXLowActive(iobase, OFF);
583 			udelay(20);
584 			// Mode select Off
585 			SlowIRRXLowActive(iobase, ON);
586 		} else {	// fir
587 			if (IsFIROn(iobase)) {	//fir
588 				// Mode select On
589 				SlowIRRXLowActive(iobase, OFF);
590 				// TX On
591 				WriteTX(iobase, ON);
592 				udelay(20);
593 				// Mode select OFF
594 				SlowIRRXLowActive(iobase, ON);
595 				udelay(20);
596 				// TX Off
597 				WriteTX(iobase, OFF);
598 			}
599 		}
600 		break;
601 
602 	case 0x0d:
603 		UseOneRX(iobase, OFF);	// use two RX pin   RX1,RX2
604 		InvertTX(iobase, OFF);
605 		InvertRX(iobase, OFF);
606 		SlowIRRXLowActive(iobase, OFF);
607 		if (IsSIROn(iobase)) {	//sir
608 			EnGPIOtoRX2(iobase, OFF);
609 			WriteGIO(iobase, OFF);
610 			EnRX2(iobase, OFF);	//sir to rx2
611 		} else {	// fir mir
612 			EnGPIOtoRX2(iobase, OFF);
613 			WriteGIO(iobase, OFF);
614 			EnRX2(iobase, OFF);	//fir to rx
615 		}
616 		break;
617 
618 	case 0x11:		/* Temic TFDS4500 */
619 
620 		IRDA_DEBUG(2, "%s: Temic TFDS4500: One RX pin, TX normal, RX inverted.\n", __func__);
621 
622 		UseOneRX(iobase, ON);	//use ONE RX....RX1
623 		InvertTX(iobase, OFF);
624 		InvertRX(iobase, ON);	// invert RX pin
625 
626 		EnRX2(iobase, ON);	//sir to rx2
627 		EnGPIOtoRX2(iobase, OFF);
628 
629 		if( IsSIROn(iobase) ){	//sir
630 
631 			// Mode select On
632 			SlowIRRXLowActive(iobase, ON);
633 			udelay(20);
634 			// Mode select Off
635 			SlowIRRXLowActive(iobase, OFF);
636 
637 		} else{
638 			IRDA_DEBUG(0, "%s: Warning: TFDS4500 not running in SIR mode !\n", __func__);
639 		}
640 		break;
641 
642 	case 0x0ff:		/* Vishay */
643 		if (IsSIROn(iobase))
644 			mode = 0;
645 		else if (IsMIROn(iobase))
646 			mode = 1;
647 		else if (IsFIROn(iobase))
648 			mode = 2;
649 		else if (IsVFIROn(iobase))
650 			mode = 5;	//VFIR-16
651 		SI_SetMode(iobase, mode);
652 		break;
653 
654 	default:
655 		IRDA_ERROR("%s: Error: dongle_id %d unsupported !\n",
656 			   __func__, dongle_id);
657 	}
658 }
659 
660 /*
661  * Function via_ircc_change_speed (self, baud)
662  *
663  *    Change the speed of the device
664  *
665  */
via_ircc_change_speed(struct via_ircc_cb * self,__u32 speed)666 static void via_ircc_change_speed(struct via_ircc_cb *self, __u32 speed)
667 {
668 	struct net_device *dev = self->netdev;
669 	u16 iobase;
670 	u8 value = 0, bTmp;
671 
672 	iobase = self->io.fir_base;
673 	/* Update accounting for new speed */
674 	self->io.speed = speed;
675 	IRDA_DEBUG(1, "%s: change_speed to %d bps.\n", __func__, speed);
676 
677 	WriteReg(iobase, I_ST_CT_0, 0x0);
678 
679 	/* Controller mode sellection */
680 	switch (speed) {
681 	case 2400:
682 	case 9600:
683 	case 19200:
684 	case 38400:
685 	case 57600:
686 	case 115200:
687 		value = (115200/speed)-1;
688 		SetSIR(iobase, ON);
689 		CRC16(iobase, ON);
690 		break;
691 	case 576000:
692 		/* FIXME: this can't be right, as it's the same as 115200,
693 		 * and 576000 is MIR, not SIR. */
694 		value = 0;
695 		SetSIR(iobase, ON);
696 		CRC16(iobase, ON);
697 		break;
698 	case 1152000:
699 		value = 0;
700 		SetMIR(iobase, ON);
701 		/* FIXME: CRC ??? */
702 		break;
703 	case 4000000:
704 		value = 0;
705 		SetFIR(iobase, ON);
706 		SetPulseWidth(iobase, 0);
707 		SetSendPreambleCount(iobase, 14);
708 		CRC16(iobase, OFF);
709 		EnTXCRC(iobase, ON);
710 		break;
711 	case 16000000:
712 		value = 0;
713 		SetVFIR(iobase, ON);
714 		/* FIXME: CRC ??? */
715 		break;
716 	default:
717 		value = 0;
718 		break;
719 	}
720 
721 	/* Set baudrate to 0x19[2..7] */
722 	bTmp = (ReadReg(iobase, I_CF_H_1) & 0x03);
723 	bTmp |= value << 2;
724 	WriteReg(iobase, I_CF_H_1, bTmp);
725 
726 	/* Some dongles may need to be informed about speed changes. */
727 	via_ircc_change_dongle_speed(iobase, speed, self->io.dongle_id);
728 
729 	/* Set FIFO size to 64 */
730 	SetFIFO(iobase, 64);
731 
732 	/* Enable IR */
733 	WriteReg(iobase, I_ST_CT_0, 0x80);
734 
735 	// EnTXFIFOHalfLevelInt(iobase,ON);
736 
737 	/* Enable some interrupts so we can receive frames */
738 	//EnAllInt(iobase,ON);
739 
740 	if (IsSIROn(iobase)) {
741 		SIRFilter(iobase, ON);
742 		SIRRecvAny(iobase, ON);
743 	} else {
744 		SIRFilter(iobase, OFF);
745 		SIRRecvAny(iobase, OFF);
746 	}
747 
748 	if (speed > 115200) {
749 		/* Install FIR xmit handler */
750 		dev->netdev_ops = &via_ircc_fir_ops;
751 		via_ircc_dma_receive(self);
752 	} else {
753 		/* Install SIR xmit handler */
754 		dev->netdev_ops = &via_ircc_sir_ops;
755 	}
756 	netif_wake_queue(dev);
757 }
758 
759 /*
760  * Function via_ircc_hard_xmit (skb, dev)
761  *
762  *    Transmit the frame!
763  *
764  */
via_ircc_hard_xmit_sir(struct sk_buff * skb,struct net_device * dev)765 static netdev_tx_t via_ircc_hard_xmit_sir(struct sk_buff *skb,
766 						struct net_device *dev)
767 {
768 	struct via_ircc_cb *self;
769 	unsigned long flags;
770 	u16 iobase;
771 	__u32 speed;
772 
773 	self = netdev_priv(dev);
774 	IRDA_ASSERT(self != NULL, return NETDEV_TX_OK;);
775 	iobase = self->io.fir_base;
776 
777 	netif_stop_queue(dev);
778 	/* Check if we need to change the speed */
779 	speed = irda_get_next_speed(skb);
780 	if ((speed != self->io.speed) && (speed != -1)) {
781 		/* Check for empty frame */
782 		if (!skb->len) {
783 			via_ircc_change_speed(self, speed);
784 			dev->trans_start = jiffies;
785 			dev_kfree_skb(skb);
786 			return NETDEV_TX_OK;
787 		} else
788 			self->new_speed = speed;
789 	}
790 	InitCard(iobase);
791 	CommonInit(iobase);
792 	SIRFilter(iobase, ON);
793 	SetSIR(iobase, ON);
794 	CRC16(iobase, ON);
795 	EnTXCRC(iobase, 0);
796 	WriteReg(iobase, I_ST_CT_0, 0x00);
797 
798 	spin_lock_irqsave(&self->lock, flags);
799 	self->tx_buff.data = self->tx_buff.head;
800 	self->tx_buff.len =
801 	    async_wrap_skb(skb, self->tx_buff.data,
802 			   self->tx_buff.truesize);
803 
804 	dev->stats.tx_bytes += self->tx_buff.len;
805 	/* Send this frame with old speed */
806 	SetBaudRate(iobase, self->io.speed);
807 	SetPulseWidth(iobase, 12);
808 	SetSendPreambleCount(iobase, 0);
809 	WriteReg(iobase, I_ST_CT_0, 0x80);
810 
811 	EnableTX(iobase, ON);
812 	EnableRX(iobase, OFF);
813 
814 	ResetChip(iobase, 0);
815 	ResetChip(iobase, 1);
816 	ResetChip(iobase, 2);
817 	ResetChip(iobase, 3);
818 	ResetChip(iobase, 4);
819 
820 	EnAllInt(iobase, ON);
821 	EnTXDMA(iobase, ON);
822 	EnRXDMA(iobase, OFF);
823 
824 	irda_setup_dma(self->io.dma, self->tx_buff_dma, self->tx_buff.len,
825 		       DMA_TX_MODE);
826 
827 	SetSendByte(iobase, self->tx_buff.len);
828 	RXStart(iobase, OFF);
829 	TXStart(iobase, ON);
830 
831 	dev->trans_start = jiffies;
832 	spin_unlock_irqrestore(&self->lock, flags);
833 	dev_kfree_skb(skb);
834 	return NETDEV_TX_OK;
835 }
836 
via_ircc_hard_xmit_fir(struct sk_buff * skb,struct net_device * dev)837 static netdev_tx_t via_ircc_hard_xmit_fir(struct sk_buff *skb,
838 						struct net_device *dev)
839 {
840 	struct via_ircc_cb *self;
841 	u16 iobase;
842 	__u32 speed;
843 	unsigned long flags;
844 
845 	self = netdev_priv(dev);
846 	iobase = self->io.fir_base;
847 
848 	if (self->st_fifo.len)
849 		return NETDEV_TX_OK;
850 	if (self->chip_id == 0x3076)
851 		iodelay(1500);
852 	else
853 		udelay(1500);
854 	netif_stop_queue(dev);
855 	speed = irda_get_next_speed(skb);
856 	if ((speed != self->io.speed) && (speed != -1)) {
857 		if (!skb->len) {
858 			via_ircc_change_speed(self, speed);
859 			dev->trans_start = jiffies;
860 			dev_kfree_skb(skb);
861 			return NETDEV_TX_OK;
862 		} else
863 			self->new_speed = speed;
864 	}
865 	spin_lock_irqsave(&self->lock, flags);
866 	self->tx_fifo.queue[self->tx_fifo.free].start = self->tx_fifo.tail;
867 	self->tx_fifo.queue[self->tx_fifo.free].len = skb->len;
868 
869 	self->tx_fifo.tail += skb->len;
870 	dev->stats.tx_bytes += skb->len;
871 	skb_copy_from_linear_data(skb,
872 		      self->tx_fifo.queue[self->tx_fifo.free].start, skb->len);
873 	self->tx_fifo.len++;
874 	self->tx_fifo.free++;
875 //F01   if (self->tx_fifo.len == 1) {
876 	via_ircc_dma_xmit(self, iobase);
877 //F01   }
878 //F01   if (self->tx_fifo.free < (MAX_TX_WINDOW -1 )) netif_wake_queue(self->netdev);
879 	dev->trans_start = jiffies;
880 	dev_kfree_skb(skb);
881 	spin_unlock_irqrestore(&self->lock, flags);
882 	return NETDEV_TX_OK;
883 
884 }
885 
via_ircc_dma_xmit(struct via_ircc_cb * self,u16 iobase)886 static int via_ircc_dma_xmit(struct via_ircc_cb *self, u16 iobase)
887 {
888 	EnTXDMA(iobase, OFF);
889 	self->io.direction = IO_XMIT;
890 	EnPhys(iobase, ON);
891 	EnableTX(iobase, ON);
892 	EnableRX(iobase, OFF);
893 	ResetChip(iobase, 0);
894 	ResetChip(iobase, 1);
895 	ResetChip(iobase, 2);
896 	ResetChip(iobase, 3);
897 	ResetChip(iobase, 4);
898 	EnAllInt(iobase, ON);
899 	EnTXDMA(iobase, ON);
900 	EnRXDMA(iobase, OFF);
901 	irda_setup_dma(self->io.dma,
902 		       ((u8 *)self->tx_fifo.queue[self->tx_fifo.ptr].start -
903 			self->tx_buff.head) + self->tx_buff_dma,
904 		       self->tx_fifo.queue[self->tx_fifo.ptr].len, DMA_TX_MODE);
905 	IRDA_DEBUG(1, "%s: tx_fifo.ptr=%x,len=%x,tx_fifo.len=%x..\n",
906 		   __func__, self->tx_fifo.ptr,
907 		   self->tx_fifo.queue[self->tx_fifo.ptr].len,
908 		   self->tx_fifo.len);
909 
910 	SetSendByte(iobase, self->tx_fifo.queue[self->tx_fifo.ptr].len);
911 	RXStart(iobase, OFF);
912 	TXStart(iobase, ON);
913 	return 0;
914 
915 }
916 
917 /*
918  * Function via_ircc_dma_xmit_complete (self)
919  *
920  *    The transfer of a frame in finished. This function will only be called
921  *    by the interrupt handler
922  *
923  */
via_ircc_dma_xmit_complete(struct via_ircc_cb * self)924 static int via_ircc_dma_xmit_complete(struct via_ircc_cb *self)
925 {
926 	int iobase;
927 	u8 Tx_status;
928 
929 	IRDA_DEBUG(3, "%s()\n", __func__);
930 
931 	iobase = self->io.fir_base;
932 	/* Disable DMA */
933 //      DisableDmaChannel(self->io.dma);
934 	/* Check for underrun! */
935 	/* Clear bit, by writing 1 into it */
936 	Tx_status = GetTXStatus(iobase);
937 	if (Tx_status & 0x08) {
938 		self->netdev->stats.tx_errors++;
939 		self->netdev->stats.tx_fifo_errors++;
940 		hwreset(self);
941 	/* how to clear underrun? */
942 	} else {
943 		self->netdev->stats.tx_packets++;
944 		ResetChip(iobase, 3);
945 		ResetChip(iobase, 4);
946 	}
947 	/* Check if we need to change the speed */
948 	if (self->new_speed) {
949 		via_ircc_change_speed(self, self->new_speed);
950 		self->new_speed = 0;
951 	}
952 
953 	/* Finished with this frame, so prepare for next */
954 	if (IsFIROn(iobase)) {
955 		if (self->tx_fifo.len) {
956 			self->tx_fifo.len--;
957 			self->tx_fifo.ptr++;
958 		}
959 	}
960 	IRDA_DEBUG(1,
961 		   "%s: tx_fifo.len=%x ,tx_fifo.ptr=%x,tx_fifo.free=%x...\n",
962 		   __func__,
963 		   self->tx_fifo.len, self->tx_fifo.ptr, self->tx_fifo.free);
964 /* F01_S
965 	// Any frames to be sent back-to-back?
966 	if (self->tx_fifo.len) {
967 		// Not finished yet!
968 	  	via_ircc_dma_xmit(self, iobase);
969 		ret = FALSE;
970 	} else {
971 F01_E*/
972 	// Reset Tx FIFO info
973 	self->tx_fifo.len = self->tx_fifo.ptr = self->tx_fifo.free = 0;
974 	self->tx_fifo.tail = self->tx_buff.head;
975 //F01   }
976 
977 	// Make sure we have room for more frames
978 //F01   if (self->tx_fifo.free < (MAX_TX_WINDOW -1 )) {
979 	// Not busy transmitting anymore
980 	// Tell the network layer, that we can accept more frames
981 	netif_wake_queue(self->netdev);
982 //F01   }
983 	return TRUE;
984 }
985 
986 /*
987  * Function via_ircc_dma_receive (self)
988  *
989  *    Set configuration for receive a frame.
990  *
991  */
via_ircc_dma_receive(struct via_ircc_cb * self)992 static int via_ircc_dma_receive(struct via_ircc_cb *self)
993 {
994 	int iobase;
995 
996 	iobase = self->io.fir_base;
997 
998 	IRDA_DEBUG(3, "%s()\n", __func__);
999 
1000 	self->tx_fifo.len = self->tx_fifo.ptr = self->tx_fifo.free = 0;
1001 	self->tx_fifo.tail = self->tx_buff.head;
1002 	self->RxDataReady = 0;
1003 	self->io.direction = IO_RECV;
1004 	self->rx_buff.data = self->rx_buff.head;
1005 	self->st_fifo.len = self->st_fifo.pending_bytes = 0;
1006 	self->st_fifo.tail = self->st_fifo.head = 0;
1007 
1008 	EnPhys(iobase, ON);
1009 	EnableTX(iobase, OFF);
1010 	EnableRX(iobase, ON);
1011 
1012 	ResetChip(iobase, 0);
1013 	ResetChip(iobase, 1);
1014 	ResetChip(iobase, 2);
1015 	ResetChip(iobase, 3);
1016 	ResetChip(iobase, 4);
1017 
1018 	EnAllInt(iobase, ON);
1019 	EnTXDMA(iobase, OFF);
1020 	EnRXDMA(iobase, ON);
1021 	irda_setup_dma(self->io.dma2, self->rx_buff_dma,
1022 		  self->rx_buff.truesize, DMA_RX_MODE);
1023 	TXStart(iobase, OFF);
1024 	RXStart(iobase, ON);
1025 
1026 	return 0;
1027 }
1028 
1029 /*
1030  * Function via_ircc_dma_receive_complete (self)
1031  *
1032  *    Controller Finished with receiving frames,
1033  *    and this routine is call by ISR
1034  *
1035  */
via_ircc_dma_receive_complete(struct via_ircc_cb * self,int iobase)1036 static int via_ircc_dma_receive_complete(struct via_ircc_cb *self,
1037 					 int iobase)
1038 {
1039 	struct st_fifo *st_fifo;
1040 	struct sk_buff *skb;
1041 	int len, i;
1042 	u8 status = 0;
1043 
1044 	iobase = self->io.fir_base;
1045 	st_fifo = &self->st_fifo;
1046 
1047 	if (self->io.speed < 4000000) {	//Speed below FIR
1048 		len = GetRecvByte(iobase, self);
1049 		skb = dev_alloc_skb(len + 1);
1050 		if (skb == NULL)
1051 			return FALSE;
1052 		// Make sure IP header gets aligned
1053 		skb_reserve(skb, 1);
1054 		skb_put(skb, len - 2);
1055 		if (self->chip_id == 0x3076) {
1056 			for (i = 0; i < len - 2; i++)
1057 				skb->data[i] = self->rx_buff.data[i * 2];
1058 		} else {
1059 			if (self->chip_id == 0x3096) {
1060 				for (i = 0; i < len - 2; i++)
1061 					skb->data[i] =
1062 					    self->rx_buff.data[i];
1063 			}
1064 		}
1065 		// Move to next frame
1066 		self->rx_buff.data += len;
1067 		self->netdev->stats.rx_bytes += len;
1068 		self->netdev->stats.rx_packets++;
1069 		skb->dev = self->netdev;
1070 		skb_reset_mac_header(skb);
1071 		skb->protocol = htons(ETH_P_IRDA);
1072 		netif_rx(skb);
1073 		return TRUE;
1074 	}
1075 
1076 	else {			//FIR mode
1077 		len = GetRecvByte(iobase, self);
1078 		if (len == 0)
1079 			return TRUE;	//interrupt only, data maybe move by RxT
1080 		if (((len - 4) < 2) || ((len - 4) > 2048)) {
1081 			IRDA_DEBUG(1, "%s(): Trouble:len=%x,CurCount=%x,LastCount=%x..\n",
1082 				   __func__, len, RxCurCount(iobase, self),
1083 				   self->RxLastCount);
1084 			hwreset(self);
1085 			return FALSE;
1086 		}
1087 		IRDA_DEBUG(2, "%s(): fifo.len=%x,len=%x,CurCount=%x..\n",
1088 			   __func__,
1089 			   st_fifo->len, len - 4, RxCurCount(iobase, self));
1090 
1091 		st_fifo->entries[st_fifo->tail].status = status;
1092 		st_fifo->entries[st_fifo->tail].len = len;
1093 		st_fifo->pending_bytes += len;
1094 		st_fifo->tail++;
1095 		st_fifo->len++;
1096 		if (st_fifo->tail > MAX_RX_WINDOW)
1097 			st_fifo->tail = 0;
1098 		self->RxDataReady = 0;
1099 
1100 		// It maybe have MAX_RX_WINDOW package receive by
1101 		// receive_complete before Timer IRQ
1102 /* F01_S
1103           if (st_fifo->len < (MAX_RX_WINDOW+2 )) {
1104 		  RXStart(iobase,ON);
1105 	  	  SetTimer(iobase,4);
1106 	  }
1107 	  else	  {
1108 F01_E */
1109 		EnableRX(iobase, OFF);
1110 		EnRXDMA(iobase, OFF);
1111 		RXStart(iobase, OFF);
1112 //F01_S
1113 		// Put this entry back in fifo
1114 		if (st_fifo->head > MAX_RX_WINDOW)
1115 			st_fifo->head = 0;
1116 		status = st_fifo->entries[st_fifo->head].status;
1117 		len = st_fifo->entries[st_fifo->head].len;
1118 		st_fifo->head++;
1119 		st_fifo->len--;
1120 
1121 		skb = dev_alloc_skb(len + 1 - 4);
1122 		/*
1123 		 * if frame size, data ptr, or skb ptr are wrong, then get next
1124 		 * entry.
1125 		 */
1126 		if ((skb == NULL) || (skb->data == NULL) ||
1127 		    (self->rx_buff.data == NULL) || (len < 6)) {
1128 			self->netdev->stats.rx_dropped++;
1129 			kfree_skb(skb);
1130 			return TRUE;
1131 		}
1132 		skb_reserve(skb, 1);
1133 		skb_put(skb, len - 4);
1134 
1135 		skb_copy_to_linear_data(skb, self->rx_buff.data, len - 4);
1136 		IRDA_DEBUG(2, "%s(): len=%x.rx_buff=%p\n", __func__,
1137 			   len - 4, self->rx_buff.data);
1138 
1139 		// Move to next frame
1140 		self->rx_buff.data += len;
1141 		self->netdev->stats.rx_bytes += len;
1142 		self->netdev->stats.rx_packets++;
1143 		skb->dev = self->netdev;
1144 		skb_reset_mac_header(skb);
1145 		skb->protocol = htons(ETH_P_IRDA);
1146 		netif_rx(skb);
1147 
1148 //F01_E
1149 	}			//FIR
1150 	return TRUE;
1151 
1152 }
1153 
1154 /*
1155  * if frame is received , but no INT ,then use this routine to upload frame.
1156  */
upload_rxdata(struct via_ircc_cb * self,int iobase)1157 static int upload_rxdata(struct via_ircc_cb *self, int iobase)
1158 {
1159 	struct sk_buff *skb;
1160 	int len;
1161 	struct st_fifo *st_fifo;
1162 	st_fifo = &self->st_fifo;
1163 
1164 	len = GetRecvByte(iobase, self);
1165 
1166 	IRDA_DEBUG(2, "%s(): len=%x\n", __func__, len);
1167 
1168 	if ((len - 4) < 2) {
1169 		self->netdev->stats.rx_dropped++;
1170 		return FALSE;
1171 	}
1172 
1173 	skb = dev_alloc_skb(len + 1);
1174 	if (skb == NULL) {
1175 		self->netdev->stats.rx_dropped++;
1176 		return FALSE;
1177 	}
1178 	skb_reserve(skb, 1);
1179 	skb_put(skb, len - 4 + 1);
1180 	skb_copy_to_linear_data(skb, self->rx_buff.data, len - 4 + 1);
1181 	st_fifo->tail++;
1182 	st_fifo->len++;
1183 	if (st_fifo->tail > MAX_RX_WINDOW)
1184 		st_fifo->tail = 0;
1185 	// Move to next frame
1186 	self->rx_buff.data += len;
1187 	self->netdev->stats.rx_bytes += len;
1188 	self->netdev->stats.rx_packets++;
1189 	skb->dev = self->netdev;
1190 	skb_reset_mac_header(skb);
1191 	skb->protocol = htons(ETH_P_IRDA);
1192 	netif_rx(skb);
1193 	if (st_fifo->len < (MAX_RX_WINDOW + 2)) {
1194 		RXStart(iobase, ON);
1195 	} else {
1196 		EnableRX(iobase, OFF);
1197 		EnRXDMA(iobase, OFF);
1198 		RXStart(iobase, OFF);
1199 	}
1200 	return TRUE;
1201 }
1202 
1203 /*
1204  * Implement back to back receive , use this routine to upload data.
1205  */
1206 
RxTimerHandler(struct via_ircc_cb * self,int iobase)1207 static int RxTimerHandler(struct via_ircc_cb *self, int iobase)
1208 {
1209 	struct st_fifo *st_fifo;
1210 	struct sk_buff *skb;
1211 	int len;
1212 	u8 status;
1213 
1214 	st_fifo = &self->st_fifo;
1215 
1216 	if (CkRxRecv(iobase, self)) {
1217 		// if still receiving ,then return ,don't upload frame
1218 		self->RetryCount = 0;
1219 		SetTimer(iobase, 20);
1220 		self->RxDataReady++;
1221 		return FALSE;
1222 	} else
1223 		self->RetryCount++;
1224 
1225 	if ((self->RetryCount >= 1) ||
1226 	    ((st_fifo->pending_bytes + 2048) > self->rx_buff.truesize) ||
1227 	    (st_fifo->len >= (MAX_RX_WINDOW))) {
1228 		while (st_fifo->len > 0) {	//upload frame
1229 			// Put this entry back in fifo
1230 			if (st_fifo->head > MAX_RX_WINDOW)
1231 				st_fifo->head = 0;
1232 			status = st_fifo->entries[st_fifo->head].status;
1233 			len = st_fifo->entries[st_fifo->head].len;
1234 			st_fifo->head++;
1235 			st_fifo->len--;
1236 
1237 			skb = dev_alloc_skb(len + 1 - 4);
1238 			/*
1239 			 * if frame size, data ptr, or skb ptr are wrong,
1240 			 * then get next entry.
1241 			 */
1242 			if ((skb == NULL) || (skb->data == NULL) ||
1243 			    (self->rx_buff.data == NULL) || (len < 6)) {
1244 				self->netdev->stats.rx_dropped++;
1245 				continue;
1246 			}
1247 			skb_reserve(skb, 1);
1248 			skb_put(skb, len - 4);
1249 			skb_copy_to_linear_data(skb, self->rx_buff.data, len - 4);
1250 
1251 			IRDA_DEBUG(2, "%s(): len=%x.head=%x\n", __func__,
1252 				   len - 4, st_fifo->head);
1253 
1254 			// Move to next frame
1255 			self->rx_buff.data += len;
1256 			self->netdev->stats.rx_bytes += len;
1257 			self->netdev->stats.rx_packets++;
1258 			skb->dev = self->netdev;
1259 			skb_reset_mac_header(skb);
1260 			skb->protocol = htons(ETH_P_IRDA);
1261 			netif_rx(skb);
1262 		}		//while
1263 		self->RetryCount = 0;
1264 
1265 		IRDA_DEBUG(2,
1266 			   "%s(): End of upload HostStatus=%x,RxStatus=%x\n",
1267 			   __func__,
1268 			   GetHostStatus(iobase), GetRXStatus(iobase));
1269 
1270 		/*
1271 		 * if frame is receive complete at this routine ,then upload
1272 		 * frame.
1273 		 */
1274 		if ((GetRXStatus(iobase) & 0x10) &&
1275 		    (RxCurCount(iobase, self) != self->RxLastCount)) {
1276 			upload_rxdata(self, iobase);
1277 			if (irda_device_txqueue_empty(self->netdev))
1278 				via_ircc_dma_receive(self);
1279 		}
1280 	}			// timer detect complete
1281 	else
1282 		SetTimer(iobase, 4);
1283 	return TRUE;
1284 
1285 }
1286 
1287 
1288 
1289 /*
1290  * Function via_ircc_interrupt (irq, dev_id)
1291  *
1292  *    An interrupt from the chip has arrived. Time to do some work
1293  *
1294  */
via_ircc_interrupt(int dummy,void * dev_id)1295 static irqreturn_t via_ircc_interrupt(int dummy, void *dev_id)
1296 {
1297 	struct net_device *dev = dev_id;
1298 	struct via_ircc_cb *self = netdev_priv(dev);
1299 	int iobase;
1300 	u8 iHostIntType, iRxIntType, iTxIntType;
1301 
1302 	iobase = self->io.fir_base;
1303 	spin_lock(&self->lock);
1304 	iHostIntType = GetHostStatus(iobase);
1305 
1306 	IRDA_DEBUG(4, "%s(): iHostIntType %02x:  %s %s %s  %02x\n",
1307 		   __func__, iHostIntType,
1308 		   (iHostIntType & 0x40) ? "Timer" : "",
1309 		   (iHostIntType & 0x20) ? "Tx" : "",
1310 		   (iHostIntType & 0x10) ? "Rx" : "",
1311 		   (iHostIntType & 0x0e) >> 1);
1312 
1313 	if ((iHostIntType & 0x40) != 0) {	//Timer Event
1314 		self->EventFlag.TimeOut++;
1315 		ClearTimerInt(iobase, 1);
1316 		if (self->io.direction == IO_XMIT) {
1317 			via_ircc_dma_xmit(self, iobase);
1318 		}
1319 		if (self->io.direction == IO_RECV) {
1320 			/*
1321 			 * frame ready hold too long, must reset.
1322 			 */
1323 			if (self->RxDataReady > 30) {
1324 				hwreset(self);
1325 				if (irda_device_txqueue_empty(self->netdev)) {
1326 					via_ircc_dma_receive(self);
1327 				}
1328 			} else {	// call this to upload frame.
1329 				RxTimerHandler(self, iobase);
1330 			}
1331 		}		//RECV
1332 	}			//Timer Event
1333 	if ((iHostIntType & 0x20) != 0) {	//Tx Event
1334 		iTxIntType = GetTXStatus(iobase);
1335 
1336 		IRDA_DEBUG(4, "%s(): iTxIntType %02x:  %s %s %s %s\n",
1337 			   __func__, iTxIntType,
1338 			   (iTxIntType & 0x08) ? "FIFO underr." : "",
1339 			   (iTxIntType & 0x04) ? "EOM" : "",
1340 			   (iTxIntType & 0x02) ? "FIFO ready" : "",
1341 			   (iTxIntType & 0x01) ? "Early EOM" : "");
1342 
1343 		if (iTxIntType & 0x4) {
1344 			self->EventFlag.EOMessage++;	// read and will auto clean
1345 			if (via_ircc_dma_xmit_complete(self)) {
1346 				if (irda_device_txqueue_empty
1347 				    (self->netdev)) {
1348 					via_ircc_dma_receive(self);
1349 				}
1350 			} else {
1351 				self->EventFlag.Unknown++;
1352 			}
1353 		}		//EOP
1354 	}			//Tx Event
1355 	//----------------------------------------
1356 	if ((iHostIntType & 0x10) != 0) {	//Rx Event
1357 		/* Check if DMA has finished */
1358 		iRxIntType = GetRXStatus(iobase);
1359 
1360 		IRDA_DEBUG(4, "%s(): iRxIntType %02x:  %s %s %s %s %s %s %s\n",
1361 			   __func__, iRxIntType,
1362 			   (iRxIntType & 0x80) ? "PHY err."	: "",
1363 			   (iRxIntType & 0x40) ? "CRC err"	: "",
1364 			   (iRxIntType & 0x20) ? "FIFO overr."	: "",
1365 			   (iRxIntType & 0x10) ? "EOF"		: "",
1366 			   (iRxIntType & 0x08) ? "RxData"	: "",
1367 			   (iRxIntType & 0x02) ? "RxMaxLen"	: "",
1368 			   (iRxIntType & 0x01) ? "SIR bad"	: "");
1369 		if (!iRxIntType)
1370 			IRDA_DEBUG(3, "%s(): RxIRQ =0\n", __func__);
1371 
1372 		if (iRxIntType & 0x10) {
1373 			if (via_ircc_dma_receive_complete(self, iobase)) {
1374 //F01       if(!(IsFIROn(iobase)))  via_ircc_dma_receive(self);
1375 				via_ircc_dma_receive(self);
1376 			}
1377 		}		// No ERR
1378 		else {		//ERR
1379 			IRDA_DEBUG(4, "%s(): RxIRQ ERR:iRxIntType=%x,HostIntType=%x,CurCount=%x,RxLastCount=%x_____\n",
1380 				   __func__, iRxIntType, iHostIntType,
1381 				   RxCurCount(iobase, self),
1382 				   self->RxLastCount);
1383 
1384 			if (iRxIntType & 0x20) {	//FIFO OverRun ERR
1385 				ResetChip(iobase, 0);
1386 				ResetChip(iobase, 1);
1387 			} else {	//PHY,CRC ERR
1388 
1389 				if (iRxIntType != 0x08)
1390 					hwreset(self);	//F01
1391 			}
1392 			via_ircc_dma_receive(self);
1393 		}		//ERR
1394 
1395 	}			//Rx Event
1396 	spin_unlock(&self->lock);
1397 	return IRQ_RETVAL(iHostIntType);
1398 }
1399 
hwreset(struct via_ircc_cb * self)1400 static void hwreset(struct via_ircc_cb *self)
1401 {
1402 	int iobase;
1403 	iobase = self->io.fir_base;
1404 
1405 	IRDA_DEBUG(3, "%s()\n", __func__);
1406 
1407 	ResetChip(iobase, 5);
1408 	EnableDMA(iobase, OFF);
1409 	EnableTX(iobase, OFF);
1410 	EnableRX(iobase, OFF);
1411 	EnRXDMA(iobase, OFF);
1412 	EnTXDMA(iobase, OFF);
1413 	RXStart(iobase, OFF);
1414 	TXStart(iobase, OFF);
1415 	InitCard(iobase);
1416 	CommonInit(iobase);
1417 	SIRFilter(iobase, ON);
1418 	SetSIR(iobase, ON);
1419 	CRC16(iobase, ON);
1420 	EnTXCRC(iobase, 0);
1421 	WriteReg(iobase, I_ST_CT_0, 0x00);
1422 	SetBaudRate(iobase, 9600);
1423 	SetPulseWidth(iobase, 12);
1424 	SetSendPreambleCount(iobase, 0);
1425 	WriteReg(iobase, I_ST_CT_0, 0x80);
1426 
1427 	/* Restore speed. */
1428 	via_ircc_change_speed(self, self->io.speed);
1429 
1430 	self->st_fifo.len = 0;
1431 }
1432 
1433 /*
1434  * Function via_ircc_is_receiving (self)
1435  *
1436  *    Return TRUE is we are currently receiving a frame
1437  *
1438  */
via_ircc_is_receiving(struct via_ircc_cb * self)1439 static int via_ircc_is_receiving(struct via_ircc_cb *self)
1440 {
1441 	int status = FALSE;
1442 	int iobase;
1443 
1444 	IRDA_ASSERT(self != NULL, return FALSE;);
1445 
1446 	iobase = self->io.fir_base;
1447 	if (CkRxRecv(iobase, self))
1448 		status = TRUE;
1449 
1450 	IRDA_DEBUG(2, "%s(): status=%x....\n", __func__, status);
1451 
1452 	return status;
1453 }
1454 
1455 
1456 /*
1457  * Function via_ircc_net_open (dev)
1458  *
1459  *    Start the device
1460  *
1461  */
via_ircc_net_open(struct net_device * dev)1462 static int via_ircc_net_open(struct net_device *dev)
1463 {
1464 	struct via_ircc_cb *self;
1465 	int iobase;
1466 	char hwname[32];
1467 
1468 	IRDA_DEBUG(3, "%s()\n", __func__);
1469 
1470 	IRDA_ASSERT(dev != NULL, return -1;);
1471 	self = netdev_priv(dev);
1472 	dev->stats.rx_packets = 0;
1473 	IRDA_ASSERT(self != NULL, return 0;);
1474 	iobase = self->io.fir_base;
1475 	if (request_irq(self->io.irq, via_ircc_interrupt, 0, dev->name, dev)) {
1476 		IRDA_WARNING("%s, unable to allocate irq=%d\n", driver_name,
1477 			     self->io.irq);
1478 		return -EAGAIN;
1479 	}
1480 	/*
1481 	 * Always allocate the DMA channel after the IRQ, and clean up on
1482 	 * failure.
1483 	 */
1484 	if (request_dma(self->io.dma, dev->name)) {
1485 		IRDA_WARNING("%s, unable to allocate dma=%d\n", driver_name,
1486 			     self->io.dma);
1487 		free_irq(self->io.irq, dev);
1488 		return -EAGAIN;
1489 	}
1490 	if (self->io.dma2 != self->io.dma) {
1491 		if (request_dma(self->io.dma2, dev->name)) {
1492 			IRDA_WARNING("%s, unable to allocate dma2=%d\n",
1493 				     driver_name, self->io.dma2);
1494 			free_irq(self->io.irq, dev);
1495 			free_dma(self->io.dma);
1496 			return -EAGAIN;
1497 		}
1498 	}
1499 
1500 
1501 	/* turn on interrupts */
1502 	EnAllInt(iobase, ON);
1503 	EnInternalLoop(iobase, OFF);
1504 	EnExternalLoop(iobase, OFF);
1505 
1506 	/* */
1507 	via_ircc_dma_receive(self);
1508 
1509 	/* Ready to play! */
1510 	netif_start_queue(dev);
1511 
1512 	/*
1513 	 * Open new IrLAP layer instance, now that everything should be
1514 	 * initialized properly
1515 	 */
1516 	sprintf(hwname, "VIA @ 0x%x", iobase);
1517 	self->irlap = irlap_open(dev, &self->qos, hwname);
1518 
1519 	self->RxLastCount = 0;
1520 
1521 	return 0;
1522 }
1523 
1524 /*
1525  * Function via_ircc_net_close (dev)
1526  *
1527  *    Stop the device
1528  *
1529  */
via_ircc_net_close(struct net_device * dev)1530 static int via_ircc_net_close(struct net_device *dev)
1531 {
1532 	struct via_ircc_cb *self;
1533 	int iobase;
1534 
1535 	IRDA_DEBUG(3, "%s()\n", __func__);
1536 
1537 	IRDA_ASSERT(dev != NULL, return -1;);
1538 	self = netdev_priv(dev);
1539 	IRDA_ASSERT(self != NULL, return 0;);
1540 
1541 	/* Stop device */
1542 	netif_stop_queue(dev);
1543 	/* Stop and remove instance of IrLAP */
1544 	if (self->irlap)
1545 		irlap_close(self->irlap);
1546 	self->irlap = NULL;
1547 	iobase = self->io.fir_base;
1548 	EnTXDMA(iobase, OFF);
1549 	EnRXDMA(iobase, OFF);
1550 	DisableDmaChannel(self->io.dma);
1551 
1552 	/* Disable interrupts */
1553 	EnAllInt(iobase, OFF);
1554 	free_irq(self->io.irq, dev);
1555 	free_dma(self->io.dma);
1556 	if (self->io.dma2 != self->io.dma)
1557 		free_dma(self->io.dma2);
1558 
1559 	return 0;
1560 }
1561 
1562 /*
1563  * Function via_ircc_net_ioctl (dev, rq, cmd)
1564  *
1565  *    Process IOCTL commands for this device
1566  *
1567  */
via_ircc_net_ioctl(struct net_device * dev,struct ifreq * rq,int cmd)1568 static int via_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq,
1569 			      int cmd)
1570 {
1571 	struct if_irda_req *irq = (struct if_irda_req *) rq;
1572 	struct via_ircc_cb *self;
1573 	unsigned long flags;
1574 	int ret = 0;
1575 
1576 	IRDA_ASSERT(dev != NULL, return -1;);
1577 	self = netdev_priv(dev);
1578 	IRDA_ASSERT(self != NULL, return -1;);
1579 	IRDA_DEBUG(1, "%s(), %s, (cmd=0x%X)\n", __func__, dev->name,
1580 		   cmd);
1581 	/* Disable interrupts & save flags */
1582 	spin_lock_irqsave(&self->lock, flags);
1583 	switch (cmd) {
1584 	case SIOCSBANDWIDTH:	/* Set bandwidth */
1585 		if (!capable(CAP_NET_ADMIN)) {
1586 			ret = -EPERM;
1587 			goto out;
1588 		}
1589 		via_ircc_change_speed(self, irq->ifr_baudrate);
1590 		break;
1591 	case SIOCSMEDIABUSY:	/* Set media busy */
1592 		if (!capable(CAP_NET_ADMIN)) {
1593 			ret = -EPERM;
1594 			goto out;
1595 		}
1596 		irda_device_set_media_busy(self->netdev, TRUE);
1597 		break;
1598 	case SIOCGRECEIVING:	/* Check if we are receiving right now */
1599 		irq->ifr_receiving = via_ircc_is_receiving(self);
1600 		break;
1601 	default:
1602 		ret = -EOPNOTSUPP;
1603 	}
1604       out:
1605 	spin_unlock_irqrestore(&self->lock, flags);
1606 	return ret;
1607 }
1608 
1609 MODULE_AUTHOR("VIA Technologies,inc");
1610 MODULE_DESCRIPTION("VIA IrDA Device Driver");
1611 MODULE_LICENSE("GPL");
1612 
1613 module_init(via_ircc_init);
1614 module_exit(via_ircc_cleanup);
1615