2 * skystar2.c - driver for the Technisat SkyStar2 PCI DVB card
3 * based on the FlexCopII by B2C2,Inc.
5 * Copyright (C) 2003 V.C. , skystar@moldova.cc
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public License
9 * as published by the Free Software Foundation; either version 2.1
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include <linux/module.h>
22 #include <linux/delay.h>
23 #include <linux/pci.h>
26 #include "dvb_frontend.h"
27 #include "dvb_functions.h"
29 #include <linux/dvb/frontend.h>
30 #include <linux/dvb/dmx.h>
31 #include "dvb_demux.h"
33 #include "dvb_filter.h"
39 #define dprintk(x...) do { if (debug) printk(x); } while (0)
41 #define SizeOfBufDMA1 0x3AC00
42 #define SizeOfBufDMA2 0x758
53 struct packet_header {
56 u32 transport_error_indicator;
57 u32 payload_unit_start_indicator;
58 u32 transport_priority;
60 u32 transport_scrambling_control;
61 u32 adaptation_field_control;
62 u32 continuity_counter;
79 struct dvb_adapter *dvb_adapter;
80 struct dvb_demux demux;
82 struct dmx_frontend hw_frontend;
83 struct dmx_frontend mem_frontend;
84 struct dvb_i2c_bus *i2c_bus;
85 struct dvb_net dvbnet;
87 struct semaphore i2c_sem;
103 #define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
104 #define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
106 static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
110 tmp = ReadRegDW(adapter, reg);
115 tmp = tmp & andvalue;
117 tmp = (tmp & andvalue) | orvalue;
119 WriteRegDW(adapter, reg, tmp);
123 static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
128 WriteRegDW(adapter, 0x100, 0);
129 WriteRegDW(adapter, 0x100, command);
131 for (i = 0; i < retries; i++) {
132 value = ReadRegDW(adapter, 0x100);
134 if ((value & 0x40000000) == 0) {
135 if ((value & 0x81000000) == 0x80000000) {
137 *buf = (value >> 0x10) & 0xff;
144 WriteRegDW(adapter, 0x100, 0);
145 WriteRegDW(adapter, 0x100, command);
152 /* device = 0x10000000 for tuner, 0x20000000 for eeprom */
153 static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
155 *command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
158 *command = *command | 0x03000000;
160 *command = *command | 0x01000000;
163 static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
170 i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
172 result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
174 if ((result & 0xff) != 0) {
176 value = ReadRegDW(adapter, 0x104);
178 for (i = 1; i < len; i++) {
179 buf[i] = value & 0xff;
188 static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
197 for (i = len; i > 1; i--) {
199 value = value | buf[i - 1];
202 WriteRegDW(adapter, 0x104, value);
205 i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
207 return i2cMainWriteForFlex2(adapter, command, 0, 100000);
210 static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
212 if (device == 0x20000000)
213 *ret = bus | ((addr >> 8) & 3);
218 static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
221 u32 bytes_to_transfer;
224 // dprintk("%s:\n", __FUNCTION__);
229 bytes_to_transfer = len;
231 if (bytes_to_transfer > 4)
232 bytes_to_transfer = 4;
234 fixchipaddr(device, bus, addr, &chipaddr);
236 if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
239 buf = buf + bytes_to_transfer;
240 addr = addr + bytes_to_transfer;
241 len = len - bytes_to_transfer;
247 static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
250 u32 bytes_to_transfer;
253 // dprintk("%s:\n", __FUNCTION__);
258 bytes_to_transfer = len;
260 if (bytes_to_transfer > 4)
261 bytes_to_transfer = 4;
263 fixchipaddr(device, bus, addr, &chipaddr);
265 if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
268 buf = buf + bytes_to_transfer;
269 addr = addr + bytes_to_transfer;
270 len = len - bytes_to_transfer;
276 static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int num)
278 struct adapter *tmp = i2c->data;
281 if (down_interruptible(&tmp->i2c_sem))
285 dprintk("%s:\n", __FUNCTION__);
287 for (i = 0; i < num; i++) {
288 printk("message %d: flags=%x, addr=0x%04x, buf=%x, len=%d \n", i, msgs[i].flags, msgs[i].addr, (u32) msgs[i].buf, msgs[i].len);
292 /* allow only the vp310 frontend to access the bus */
293 if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
299 if ((num == 1) && (msgs[0].buf != NULL)) {
300 if (msgs[0].flags == I2C_M_RD) {
305 // single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
306 ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
308 if (ret != msgs[0].len - 1)
314 } else if ((num == 2) && (msgs[1].buf != NULL)) {
316 // i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
317 if (msgs[1].flags == I2C_M_RD) {
318 ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
322 ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
325 if (ret != msgs[1].len)
333 /* master xfer functions always return the number of successfully
334 transmitted messages, not the number of transmitted bytes.
335 return -EREMOTEIO in case of failure. */
339 /* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
340 but it seems that FlexCopII can work with more than one chip) */
341 static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
347 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
351 WriteRegDW(adapter, 0x714, tmp);
352 WriteRegDW(adapter, 0x714, tmp);
356 /* return value is never used? */
360 static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
366 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
371 WriteRegDW(adapter, 0x714, tmp);
372 WriteRegDW(adapter, 0x714, tmp);
376 /* return value is never used? */
380 static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
386 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
391 WriteRegDW(adapter, 0x714, tmp);
392 WriteRegDW(adapter, 0x714, tmp);
396 /* return value is never used? */
400 static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
406 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
411 WriteRegDW(adapter, 0x714, tmp);
412 WriteRegDW(adapter, 0x714, tmp);
416 /* return value is never used? */
420 /* SRAM memory is accessed through a buffer register in the FlexCop
421 chip (0x700). This register has the following structure:
423 bit 15 : read/write flag
424 bits 16-23 : 8-bit word to write
426 bits 28-29 : memory bank selector
429 static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
431 u32 i, command, retries;
433 for (i = 0; i < len; i++) {
434 command = bank | addr | 0x04000000 | (*buf << 0x10);
438 while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
444 printk("%s: SRAM timeout\n", __FUNCTION__);
446 WriteRegDW(adapter, 0x700, command);
453 static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
455 u32 i, command, value, retries;
457 for (i = 0; i < len; i++) {
458 command = bank | addr | 0x04008000;
462 while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
468 printk("%s: SRAM timeout\n", __FUNCTION__);
470 WriteRegDW(adapter, 0x700, command);
474 while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
480 printk("%s: SRAM timeout\n", __FUNCTION__);
482 value = ReadRegDW(adapter, 0x700) >> 0x10;
484 *buf = (value & 0xff);
491 static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
497 if (adapter->dwSramType == 0x20000) {
498 bank = (addr & 0x18000) << 0x0D;
501 if (adapter->dwSramType == 0x00000) {
502 if ((addr >> 0x0F) == 0)
508 FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
511 static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
517 if (adapter->dwSramType == 0x20000) {
518 bank = (addr & 0x18000) << 0x0D;
521 if (adapter->dwSramType == 0x00000) {
522 if ((addr >> 0x0F) == 0)
528 FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
531 static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
538 // check if the address range belongs to the same
539 // 32K memory chip. If not, the data is read from
540 // one chip at a time.
541 if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
542 length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
545 SRAM_readChunk(adapter, addr, buf, length);
547 addr = addr + length;
553 static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
560 // check if the address range belongs to the same
561 // 32K memory chip. If not, the data is written to
562 // one chip at a time.
563 if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
564 length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
567 SRAM_writeChunk(adapter, addr, buf, length);
569 addr = addr + length;
575 static void SRAM_setSize(struct adapter *adapter, u32 mask)
577 WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
580 static void SRAM_init(struct adapter *adapter)
584 tmp = ReadRegDW(adapter, 0x71C);
586 WriteRegDW(adapter, 0x71C, 1);
588 if (ReadRegDW(adapter, 0x71C) != 0) {
589 WriteRegDW(adapter, 0x71C, tmp);
591 adapter->dwSramType = tmp & 0x30000;
593 dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
597 adapter->dwSramType = 0x10000;
599 dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
602 /* return value is never used? */
603 /* return adapter->dwSramType; */
606 static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
610 dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
612 SRAM_setSize(adapter, mask);
618 SRAM_write(adapter, addr, &tmp2, 1);
619 SRAM_write(adapter, addr + 4, &tmp1, 1);
625 SRAM_read(adapter, addr, &tmp2, 1);
626 SRAM_read(adapter, addr, &tmp2, 1);
628 dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
636 SRAM_write(adapter, addr, &tmp2, 1);
637 SRAM_write(adapter, addr + 4, &tmp1, 1);
643 SRAM_read(adapter, addr, &tmp2, 1);
644 SRAM_read(adapter, addr, &tmp2, 1);
646 dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
654 static u32 SRAM_length(struct adapter * adapter)
656 if (adapter->dwSramType == 0x10000)
658 if (adapter->dwSramType == 0x00000)
660 if (adapter->dwSramType == 0x20000)
661 return 131072; // 128K
666 /* FlexcopII can work with 32K, 64K or 128K of external SRAM memory.
667 - for 128K there are 4x32K chips at bank 0,1,2,3.
668 - for 64K there are 2x32K chips at bank 1,2.
669 - for 32K there is one 32K chip at bank 0.
671 FlexCop works only with one bank at a time. The bank is selected
672 by bits 28-29 of the 0x700 register.
674 bank 0 covers addresses 0x00000-0x07FFF
675 bank 1 covers addresses 0x08000-0x0FFFF
676 bank 2 covers addresses 0x10000-0x17FFF
677 bank 3 covers addresses 0x18000-0x1FFFF
679 static int SramDetectForFlex2(struct adapter *adapter)
683 dprintk("%s:\n", __FUNCTION__);
685 tmp = ReadRegDW(adapter, 0x208);
686 WriteRegDW(adapter, 0x208, 0);
688 tmp2 = ReadRegDW(adapter, 0x71C);
690 dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
692 WriteRegDW(adapter, 0x71C, 1);
694 tmp3 = ReadRegDW(adapter, 0x71C);
696 dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
698 WriteRegDW(adapter, 0x71C, tmp2);
700 // check for internal SRAM ???
703 SRAM_setSize(adapter, 0x10000);
705 WriteRegDW(adapter, 0x208, tmp);
707 dprintk("%s: sram size = 32K\n", __FUNCTION__);
712 if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
713 SRAM_setSize(adapter, 0x20000);
715 WriteRegDW(adapter, 0x208, tmp);
717 dprintk("%s: sram size = 128K\n", __FUNCTION__);
722 if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
723 SRAM_setSize(adapter, 0x00000);
725 WriteRegDW(adapter, 0x208, tmp);
727 dprintk("%s: sram size = 64K\n", __FUNCTION__);
732 if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
733 SRAM_setSize(adapter, 0x10000);
735 WriteRegDW(adapter, 0x208, tmp);
737 dprintk("%s: sram size = 32K\n", __FUNCTION__);
742 SRAM_setSize(adapter, 0x10000);
744 WriteRegDW(adapter, 0x208, tmp);
746 dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
751 static void SLL_detectSramSize(struct adapter *adapter)
753 SramDetectForFlex2(adapter);
755 /* EEPROM (Skystar2 has one "24LC08B" chip on board) */
757 static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
759 return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
763 static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
765 return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
768 u8 calc_LRC(u8 * buf, u32 len)
775 for (i = 0; i < len; i++)
781 static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
785 for (i = 0; i < retries; i++) {
786 if (EEPROM_read(adapter, addr, buf, len) == len) {
787 if (calc_LRC(buf, len - 1) == buf[len - 1])
796 static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
800 for (i = 0; i < retries; i++) {
801 if (EEPROM_write(adapter, addr, wbuf, len) == len) {
802 if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
811 /* These functions could be called from the initialization routine
812 to unlock SkyStar2 cards, locked by "Europe On Line".
814 in cards from "Europe On Line" the key is:
817 0xB2, 0x01, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0x00,
819 0x00, 0x00, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00,
825 in unlocked cards the key is:
828 0xB2, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x00, 0x00, 0x00,
837 static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
845 memcpy(wbuf, key, len);
850 wbuf[19] = calc_LRC(wbuf, 19);
852 return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
855 static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
862 if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
865 memcpy(key, buf, len);
870 static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
874 if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
912 static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
935 tmp[7] = calc_LRC(tmp, 7);
937 if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
945 static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
947 dprintk("%s: op=%x\n", __FUNCTION__, op);
950 WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
954 WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
958 static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
960 dprintk("%s: op=%x\n", __FUNCTION__, op);
963 WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
967 WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
971 static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
973 dprintk("%s: op=%x\n", __FUNCTION__, op);
976 WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
980 WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
984 static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
986 dprintk("%s: op=%x\n", __FUNCTION__, op);
989 WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
993 WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
997 static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
999 dprintk("%s: op=%x\n", __FUNCTION__, op);
1002 WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
1006 WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
1010 static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
1012 dprintk("%s: op=%x\n", __FUNCTION__, op);
1015 WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
1019 WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
1024 static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
1026 dprintk("%s: op=%x\n", __FUNCTION__, op);
1029 WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
1033 WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
1038 static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
1040 dprintk("%s: op=%x\n", __FUNCTION__, op);
1043 WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
1047 WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
1052 static void CtrlEnableMAC(struct adapter *adapter, u32 op)
1055 WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
1059 WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
1063 static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
1067 tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
1068 tmp2 = (mac[5] << 0x08) | mac[4];
1070 WriteRegDW(adapter, 0x418, tmp1);
1071 WriteRegDW(adapter, 0x41C, tmp2);
1077 static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
1080 WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
1082 adapter->mac_filter = 1;
1086 if (adapter->mac_filter != 0) {
1087 adapter->mac_filter = 0;
1089 WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
1096 static void CheckNullFilterEnable(struct adapter *adapter)
1098 FilterEnableNullFilter(adapter, 1);
1099 FilterEnableMaskFilter(adapter, 1);
1103 static void InitPIDsInfo(struct adapter *adapter)
1107 for (i = 0; i < 0x27; i++)
1108 adapter->pids[i] = 0x1FFF;
1111 static int CheckPID(struct adapter *adapter, u16 pid)
1118 for (i = 0; i < 0x27; i++) {
1119 if (adapter->pids[i] == pid)
1126 static void PidSetGroupPID(struct adapter * adapter, u32 pid)
1130 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1132 value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
1134 WriteRegDW(adapter, 0x30C, value);
1136 /* return value is never used? */
1140 static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
1144 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1146 value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
1148 WriteRegDW(adapter, 0x30C, value);
1150 /* return value is never used? */
1154 static void PidSetStream1PID(struct adapter * adapter, u32 pid)
1158 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1160 value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
1162 WriteRegDW(adapter, 0x300, value);
1164 /* return value is never used? */
1168 static void PidSetStream2PID(struct adapter * adapter, u32 pid)
1172 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1174 value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
1176 WriteRegDW(adapter, 0x300, value);
1178 /* return value is never used? */
1182 static void PidSetPcrPID(struct adapter * adapter, u32 pid)
1186 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1188 value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
1190 WriteRegDW(adapter, 0x304, value);
1192 /* return value is never used? */
1196 static void PidSetPmtPID(struct adapter * adapter, u32 pid)
1200 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1202 value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
1204 WriteRegDW(adapter, 0x304, value);
1206 /* return value is never used? */
1210 static void PidSetEmmPID(struct adapter * adapter, u32 pid)
1214 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1216 value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
1218 WriteRegDW(adapter, 0x308, value);
1220 /* return value is never used? */
1224 static void PidSetEcmPID(struct adapter * adapter, u32 pid)
1228 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1230 value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
1232 WriteRegDW(adapter, 0x308, value);
1234 /* return value is never used? */
1238 static int PidGetStream1PID(struct adapter * adapter)
1240 return ReadRegDW(adapter, 0x300) & 0x00001FFF;
1243 static int PidGetStream2PID(struct adapter * adapter)
1245 return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
1248 static int PidGetPcrPID(struct adapter * adapter)
1250 return ReadRegDW(adapter, 0x304) & 0x00001FFF;
1253 static int PidGetPmtPID(struct adapter * adapter)
1255 return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
1258 static int PidGetEmmPID(struct adapter * adapter)
1260 return ReadRegDW(adapter, 0x308) & 0x00001FFF;
1263 static int PidGetEcmPID(struct adapter * adapter)
1265 return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
1268 static int PidGetGroupPID(struct adapter * adapter)
1270 return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
1273 static int PidGetGroupMASK(struct adapter * adapter)
1275 return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
1279 static void ResetHardwarePIDFilter(struct adapter *adapter)
1281 PidSetStream1PID(adapter, 0x1FFF);
1283 PidSetStream2PID(adapter, 0x1FFF);
1284 FilterEnableStream2Filter(adapter, 0);
1286 PidSetPcrPID(adapter, 0x1FFF);
1287 FilterEnablePcrFilter(adapter, 0);
1289 PidSetPmtPID(adapter, 0x1FFF);
1290 FilterEnablePmtFilter(adapter, 0);
1292 PidSetEcmPID(adapter, 0x1FFF);
1293 FilterEnableEcmFilter(adapter, 0);
1295 PidSetEmmPID(adapter, 0x1FFF);
1296 FilterEnableEmmFilter(adapter, 0);
1300 static void OpenWholeBandwidth(struct adapter *adapter)
1302 PidSetGroupPID(adapter, 0);
1304 PidSetGroupMASK(adapter, 0);
1306 FilterEnableMaskFilter(adapter, 1);
1309 static int AddHwPID(struct adapter *adapter, u32 pid)
1311 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1316 if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
1319 if (PidGetStream1PID(adapter) == 0x1FFF) {
1320 PidSetStream1PID(adapter, pid & 0xFFFF);
1322 FilterEnableStream1Filter(adapter, 1);
1327 if (PidGetStream2PID(adapter) == 0x1FFF) {
1328 PidSetStream2PID(adapter, (pid & 0xFFFF));
1330 FilterEnableStream2Filter(adapter, 1);
1335 if (PidGetPcrPID(adapter) == 0x1FFF) {
1336 PidSetPcrPID(adapter, (pid & 0xFFFF));
1338 FilterEnablePcrFilter(adapter, 1);
1343 if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
1344 PidSetPmtPID(adapter, (pid & 0xFFFF));
1346 FilterEnablePmtFilter(adapter, 1);
1351 if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
1352 PidSetEmmPID(adapter, (pid & 0xFFFF));
1354 FilterEnableEmmFilter(adapter, 1);
1359 if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
1360 PidSetEcmPID(adapter, (pid & 0xFFFF));
1362 FilterEnableEcmFilter(adapter, 1);
1370 static int RemoveHwPID(struct adapter *adapter, u32 pid)
1372 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1377 if (PidGetStream1PID(adapter) == pid) {
1378 PidSetStream1PID(adapter, 0x1FFF);
1383 if (PidGetStream2PID(adapter) == pid) {
1384 PidSetStream2PID(adapter, 0x1FFF);
1386 FilterEnableStream2Filter(adapter, 0);
1391 if (PidGetPcrPID(adapter) == pid) {
1392 PidSetPcrPID(adapter, 0x1FFF);
1394 FilterEnablePcrFilter(adapter, 0);
1399 if (PidGetPmtPID(adapter) == pid) {
1400 PidSetPmtPID(adapter, 0x1FFF);
1402 FilterEnablePmtFilter(adapter, 0);
1407 if (PidGetEmmPID(adapter) == pid) {
1408 PidSetEmmPID(adapter, 0x1FFF);
1410 FilterEnableEmmFilter(adapter, 0);
1415 if (PidGetEcmPID(adapter) == pid) {
1416 PidSetEcmPID(adapter, 0x1FFF);
1418 FilterEnableEcmFilter(adapter, 0);
1426 static int AddPID(struct adapter *adapter, u32 pid)
1430 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1435 if (CheckPID(adapter, pid) == 1)
1438 for (i = 0; i < 0x27; i++) {
1439 if (adapter->pids[i] == 0x1FFF) // find free pid filter
1441 adapter->pids[i] = pid;
1443 if (AddHwPID(adapter, pid) < 0)
1444 OpenWholeBandwidth(adapter);
1453 static int RemovePID(struct adapter *adapter, u32 pid)
1457 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1462 for (i = 0; i < 0x27; i++) {
1463 if (adapter->pids[i] == pid) {
1464 adapter->pids[i] = 0x1FFF;
1466 RemoveHwPID(adapter, pid);
1476 static void CtrlEnableSmc(struct adapter *adapter, u32 op)
1479 WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
1483 WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
1487 static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
1489 adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
1493 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00010000;
1495 adapter->dma_ctrl = adapter->dma_ctrl | 0x00010000;
1498 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00020000;
1500 adapter->dma_ctrl = adapter->dma_ctrl | 0x00020000;
1505 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00040000;
1507 adapter->dma_ctrl = adapter->dma_ctrl | 0x00040000;
1510 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00080000;
1512 adapter->dma_ctrl = adapter->dma_ctrl | 0x00080000;
1516 static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
1520 value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
1523 value = value | (adapter->dma_ctrl & 0x000F0000);
1525 WriteRegDW(adapter, 0x208, value);
1528 /* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
1531 The DMA1 buffer is divided in 2 subbuffers of equal size.
1532 FlexCopII will transfer TS data to one subbuffer, signal an interrupt
1533 when the subbuffer is full and continue fillig the second subbuffer.
1536 subbuffer size in 32-bit words is stored in the first 24 bits of
1537 register 0x004. The last 8 bits of register 0x004 contain the number
1540 the first 30 bits of register 0x000 contain the address of the first
1541 subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
1542 when dma1 is enabled.
1544 the first 30 bits of register 0x00C contain the address of the second
1545 subbuffer. the last 2 bits contain 1.
1547 register 0x008 will contain the address of the subbuffer that was filled
1548 with TS data, when FlexCopII will generate an interrupt.
1551 subbuffer size in 32-bit words is stored in the first 24 bits of
1552 register 0x014. The last 8 bits of register 0x014 contain the number
1555 the first 30 bits of register 0x010 contain the address of the first
1556 subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
1557 when dma1 is enabled.
1559 the first 30 bits of register 0x01C contain the address of the second
1560 subbuffer. the last 2 bits contain 1.
1562 register 0x018 contains the address of the subbuffer that was filled
1563 with TS data, when FlexCopII generates an interrupt.
1565 static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
1567 u32 subbuffers, subbufsize, subbuf0, subbuf1;
1569 if (dma_channel == 0) {
1570 dprintk("%s: Initializing DMA1 channel\n", __FUNCTION__);
1574 subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
1576 subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
1578 subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
1580 dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
1582 WriteRegDW(adapter, 0x000, subbuf0);
1584 dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
1586 WriteRegDW(adapter, 0x004, subbufsize);
1588 dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
1590 WriteRegDW(adapter, 0x00C, subbuf1);
1592 dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
1593 WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
1596 if (subbuffers == 0)
1597 DmaEnableDisableIrq(adapter, 0, 1, 0);
1599 DmaEnableDisableIrq(adapter, 0, 1, 1);
1601 IrqDmaEnableDisableIrq(adapter, 1);
1603 SRAMSetMediaDest(adapter, 1);
1604 SRAMSetNetDest(adapter, 1);
1605 SRAMSetCaiDest(adapter, 2);
1606 SRAMSetCaoDest(adapter, 2);
1609 if (dma_channel == 1) {
1610 dprintk("%s: Initializing DMA2 channel\n", __FUNCTION__);
1614 subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
1616 subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
1618 subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
1620 dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
1622 WriteRegDW(adapter, 0x010, subbuf0);
1624 dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
1626 WriteRegDW(adapter, 0x014, subbufsize);
1628 dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
1630 WriteRegDW(adapter, 0x01C, subbuf1);
1632 SRAMSetCaiDest(adapter, 2);
1638 static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
1641 WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
1643 adapter->dma_status = adapter->dma_status & ~0x00000004;
1647 WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
1649 adapter->dma_status = adapter->dma_status | 0x00000004;
1653 /* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
1654 bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
1656 static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
1658 u32 dma_enable, dma1_enable, dma2_enable;
1660 dprintk("%s: dma_mask=%x\n", __FUNCTION__, dma_mask);
1662 if (start_stop == 1) {
1663 dprintk("%s: starting dma\n", __FUNCTION__);
1668 if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) == 0) && (adapter->dmaq1.bus_addr != 0)) {
1669 adapter->dma_status = adapter->dma_status | 1;
1673 if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) == 0) && (adapter->dmaq2.bus_addr != 0)) {
1674 adapter->dma_status = adapter->dma_status | 2;
1677 // enable dma1 and dma2
1678 if ((dma1_enable == 1) && (dma2_enable == 1)) {
1679 WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
1680 WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
1681 WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
1683 CtrlEnableReceiveData(adapter, 1);
1688 if ((dma1_enable == 1) && (dma2_enable == 0)) {
1689 WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
1690 WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
1692 CtrlEnableReceiveData(adapter, 1);
1697 if ((dma1_enable == 0) && (dma2_enable == 1)) {
1698 WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
1700 CtrlEnableReceiveData(adapter, 1);
1705 if ((dma1_enable == 0) && (dma2_enable == 0)) {
1706 CtrlEnableReceiveData(adapter, 1);
1713 dprintk("%s: stoping dma\n", __FUNCTION__);
1715 dma_enable = adapter->dma_status & 0x00000003;
1717 if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
1718 dma_enable = dma_enable & 0xFFFFFFFE;
1721 if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
1722 dma_enable = dma_enable & 0xFFFFFFFD;
1725 if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
1726 CtrlEnableReceiveData(adapter, 0);
1731 if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
1732 WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
1733 WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
1735 adapter->dma_status = adapter->dma_status & ~0x00000001;
1738 if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
1739 WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
1741 adapter->dma_status = adapter->dma_status & ~0x00000002;
1746 static void OpenStream(struct adapter *adapter, u32 pid)
1750 if (adapter->capturing == 0)
1751 adapter->capturing = 1;
1753 FilterEnableMaskFilter(adapter, 1);
1755 AddPID(adapter, pid);
1757 dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
1759 if ((adapter->dma_status & 7) != 7) {
1762 if (((adapter->dma_status & 0x10000000) != 0) && ((adapter->dma_status & 1) == 0)) {
1763 dma_mask = dma_mask | 1;
1765 adapter->dmaq1.head = 0;
1766 adapter->dmaq1.tail = 0;
1768 memset(adapter->dmaq1.buffer, 0, adapter->dmaq1.buffer_size);
1771 if (((adapter->dma_status & 0x20000000) != 0) && ((adapter->dma_status & 2) == 0)) {
1772 dma_mask = dma_mask | 2;
1774 adapter->dmaq2.head = 0;
1775 adapter->dmaq2.tail = 0;
1778 if (dma_mask != 0) {
1779 IrqDmaEnableDisableIrq(adapter, 1);
1781 DmaStartStop0x2102(adapter, dma_mask, 1);
1786 static void CloseStream(struct adapter *adapter, u32 pid)
1790 if (adapter->capturing != 0)
1791 adapter->capturing = 0;
1793 dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
1797 if ((adapter->dma_status & 1) != 0)
1798 dma_mask = dma_mask | 0x00000001;
1799 if ((adapter->dma_status & 2) != 0)
1800 dma_mask = dma_mask | 0x00000002;
1802 if (dma_mask != 0) {
1803 DmaStartStop0x2102(adapter, dma_mask, 0);
1806 RemovePID(adapter, pid);
1809 static void InterruptServiceDMA1(struct adapter *adapter)
1811 struct dvb_demux *dvbdmx = &adapter->demux;
1812 struct packet_header packet_header;
1815 u32 nNumBytesParsed;
1816 u32 nNumNewBytesTransferred;
1817 u32 dwDefaultPacketSize = 188;
1818 u8 gbTmpBuffer[188];
1821 nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
1822 nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
1824 if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
1825 dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
1829 adapter->dmaq1.head = nCurDmaCounter;
1831 if (adapter->dmaq1.tail <= nCurDmaCounter) {
1832 nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
1836 nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
1839 // dprintk("%s: nCurDmaCounter = %d\n" , __FUNCTION__, nCurDmaCounter);
1840 // dprintk("%s: dmaq1.tail = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
1841 // dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
1843 if (nNumNewBytesTransferred < dwDefaultPacketSize)
1846 nNumBytesParsed = 0;
1848 while (nNumBytesParsed < nNumNewBytesTransferred) {
1849 pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
1851 if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
1852 memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
1853 memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
1855 pbDMABufCurPos = gbTmpBuffer;
1858 if (adapter->capturing != 0) {
1859 u32 *dq = (u32 *) pbDMABufCurPos;
1861 packet_header.sync_byte = *dq & 0x000000FF;
1862 packet_header.transport_error_indicator = *dq & 0x00008000;
1863 packet_header.payload_unit_start_indicator = *dq & 0x00004000;
1864 packet_header.transport_priority = *dq & 0x00002000;
1865 packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
1866 packet_header.transport_scrambling_control = *dq >> 0x1E;
1867 packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
1868 packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
1870 if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
1871 if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
1872 dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
1876 // dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
1881 nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
1883 adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
1885 if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
1886 adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
1890 static void InterruptServiceDMA2(struct adapter *adapter)
1892 printk("%s:\n", __FUNCTION__);
1895 static irqreturn_t isr(int irq, void *dev_id, struct pt_regs *regs)
1897 struct adapter *tmp = dev_id;
1901 // dprintk("%s:\n", __FUNCTION__);
1903 spin_lock_irq(&tmp->lock);
1905 if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
1906 spin_unlock_irq(&tmp->lock);
1910 while (value != 0) {
1911 if ((value & 0x03) != 0)
1912 InterruptServiceDMA1(tmp);
1913 if ((value & 0x0C) != 0)
1914 InterruptServiceDMA2(tmp);
1915 value = ReadRegDW(tmp, 0x20C) & 0x0F;
1918 spin_unlock_irq(&tmp->lock);
1922 static void Initdmaqueue(struct adapter *adapter)
1924 dma_addr_t dma_addr;
1926 if (adapter->dmaq1.buffer != 0)
1929 adapter->dmaq1.head = 0;
1930 adapter->dmaq1.tail = 0;
1931 adapter->dmaq1.buffer = 0;
1933 adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
1935 if (adapter->dmaq1.buffer != 0) {
1936 memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
1938 adapter->dmaq1.bus_addr = dma_addr;
1939 adapter->dmaq1.buffer_size = SizeOfBufDMA1;
1941 DmaInitDMA(adapter, 0);
1943 adapter->dma_status = adapter->dma_status | 0x10000000;
1945 dprintk("%s: allocated dma buffer at 0x%x, length=%d\n", __FUNCTION__, (int) adapter->dmaq1.buffer, SizeOfBufDMA1);
1949 adapter->dma_status = adapter->dma_status & ~0x10000000;
1952 if (adapter->dmaq2.buffer != 0)
1955 adapter->dmaq2.head = 0;
1956 adapter->dmaq2.tail = 0;
1957 adapter->dmaq2.buffer = 0;
1959 adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
1961 if (adapter->dmaq2.buffer != 0) {
1962 memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
1964 adapter->dmaq2.bus_addr = dma_addr;
1965 adapter->dmaq2.buffer_size = SizeOfBufDMA2;
1967 DmaInitDMA(adapter, 1);
1969 adapter->dma_status = adapter->dma_status | 0x20000000;
1971 dprintk("%s: allocated dma buffer at 0x%x, length=%d\n", __FUNCTION__, (int) adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
1975 adapter->dma_status = adapter->dma_status & ~0x20000000;
1979 static void Freedmaqueue(struct adapter *adapter)
1981 if (adapter->dmaq1.buffer != 0) {
1982 pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
1984 adapter->dmaq1.bus_addr = 0;
1985 adapter->dmaq1.head = 0;
1986 adapter->dmaq1.tail = 0;
1987 adapter->dmaq1.buffer_size = 0;
1988 adapter->dmaq1.buffer = 0;
1991 if (adapter->dmaq2.buffer != 0) {
1992 pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
1994 adapter->dmaq2.bus_addr = 0;
1995 adapter->dmaq2.head = 0;
1996 adapter->dmaq2.tail = 0;
1997 adapter->dmaq2.buffer_size = 0;
1998 adapter->dmaq2.buffer = 0;
2002 static void FreeAdapterObject(struct adapter *adapter)
2004 dprintk("%s:\n", __FUNCTION__);
2006 CloseStream(adapter, 0);
2008 if (adapter->irq != 0)
2009 free_irq(adapter->irq, adapter);
2011 Freedmaqueue(adapter);
2013 if (adapter->io_mem != 0)
2014 iounmap((void *) adapter->io_mem);
2020 static struct pci_driver skystar2_pci_driver;
2022 static int ClaimAdapter(struct adapter *adapter)
2024 struct pci_dev *pdev = adapter->pdev;
2028 if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), skystar2_pci_driver.name))
2031 if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), skystar2_pci_driver.name))
2034 pci_read_config_byte(pdev, PCI_CLASS_REVISION, &adapter->card_revision);
2036 dprintk("%s: card revision %x \n", __FUNCTION__, adapter->card_revision);
2038 if (pci_enable_device(pdev))
2041 pci_read_config_word(pdev, 4, &var);
2044 pci_set_master(pdev);
2046 adapter->io_port = pdev->resource[1].start;
2048 adapter->io_mem = (u32) ioremap(pdev->resource[0].start, 0x800);
2050 if (adapter->io_mem == 0) {
2051 dprintk("%s: can not map io memory\n", __FUNCTION__);
2056 dprintk("%s: io memory maped at %x\n", __FUNCTION__, adapter->io_mem);
2062 static int SLL_reset_FlexCOP(struct adapter *adapter)
2064 WriteRegDW(adapter, 0x208, 0);
2065 WriteRegDW(adapter, 0x210, 0xB2FF);
2071 static int DriverInitialize(struct pci_dev * pdev)
2073 struct adapter *adapter;
2077 if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
2078 dprintk("%s: out of memory!\n", __FUNCTION__);
2083 memset(adapter, 0, sizeof(struct adapter));
2085 pci_set_drvdata(pdev,adapter);
2087 adapter->pdev = pdev;
2088 adapter->irq = pdev->irq;
2090 if ((ClaimAdapter(adapter)) != 1) {
2091 FreeAdapterObject(adapter);
2096 IrqDmaEnableDisableIrq(adapter, 0);
2098 if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
2099 dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
2101 FreeAdapterObject(adapter);
2106 ReadRegDW(adapter, 0x208);
2107 WriteRegDW(adapter, 0x208, 0);
2108 WriteRegDW(adapter, 0x210, 0xB2FF);
2109 WriteRegDW(adapter, 0x208, 0x40);
2111 InitPIDsInfo(adapter);
2113 PidSetGroupPID(adapter, 0);
2114 PidSetGroupMASK(adapter, 0x1FE0);
2115 PidSetStream1PID(adapter, 0x1FFF);
2116 PidSetStream2PID(adapter, 0x1FFF);
2117 PidSetPmtPID(adapter, 0x1FFF);
2118 PidSetPcrPID(adapter, 0x1FFF);
2119 PidSetEcmPID(adapter, 0x1FFF);
2120 PidSetEmmPID(adapter, 0x1FFF);
2122 Initdmaqueue(adapter);
2124 if ((adapter->dma_status & 0x30000000) == 0) {
2125 FreeAdapterObject(adapter);
2130 adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
2132 if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
2133 if (adapter->b2c2_revision != 0x82) {
2134 dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
2135 dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
2137 FreeAdapterObject(adapter);
2142 tmp = ReadRegDW(adapter, 0x204);
2144 WriteRegDW(adapter, 0x204, 0);
2147 WriteRegDW(adapter, 0x204, tmp);
2150 tmp = ReadRegDW(adapter, 0x308);
2151 WriteRegDW(adapter, 0x308, 0x4000 | tmp);
2153 adapter->dwSramType = 0x10000;
2155 SLL_detectSramSize(adapter);
2157 dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
2159 SRAMSetMediaDest(adapter, 1);
2160 SRAMSetNetDest(adapter, 1);
2162 CtrlEnableSmc(adapter, 0);
2164 SRAMSetCaiDest(adapter, 2);
2165 SRAMSetCaoDest(adapter, 2);
2167 DmaEnableDisableIrq(adapter, 1, 0, 0);
2169 if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
2170 printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0], adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5], adapter->mac_addr[6], adapter->mac_addr[7]
2173 CASetMacDstAddrFilter(adapter, adapter->mac_addr);
2174 CtrlEnableMAC(adapter, 1);
2177 EEPROM_readKey(adapter, key, 16);
2179 printk("%s key = \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n", __FUNCTION__, key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7], key[8], key[9], key[10], key[11], key[12], key[13], key[14], key[15]);
2181 adapter->lock = SPIN_LOCK_UNLOCKED;
2186 static void DriverHalt(struct pci_dev *pdev)
2188 struct adapter *adapter;
2190 adapter = pci_get_drvdata(pdev);
2192 IrqDmaEnableDisableIrq(adapter, 0);
2194 CtrlEnableReceiveData(adapter, 0);
2196 FreeAdapterObject(adapter);
2198 pci_set_drvdata(pdev, NULL);
2200 release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
2202 release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
2205 static int dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
2207 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
2208 struct adapter *adapter = (struct adapter *) dvbdmx->priv;
2210 dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
2212 OpenStream(adapter, dvbdmxfeed->pid);
2217 static int dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
2219 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
2220 struct adapter *adapter = (struct adapter *) dvbdmx->priv;
2222 dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
2224 CloseStream(adapter, dvbdmxfeed->pid);
2230 static void set_tuner_tone(struct adapter *adapter, u8 tone)
2232 u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
2235 dprintk("%s: %u\n", __FUNCTION__, tone);
2239 ax = wzHalfPeriodFor45MHz[0];
2242 ax = wzHalfPeriodFor45MHz[1];
2245 ax = wzHalfPeriodFor45MHz[2];
2248 ax = wzHalfPeriodFor45MHz[3];
2256 WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
2260 WriteRegDW(adapter, 0x200, 0x40FF8000);
2264 static void set_tuner_polarity(struct adapter *adapter, u8 polarity)
2268 dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
2270 var = ReadRegDW(adapter, 0x204);
2272 if (polarity == 0) {
2273 dprintk("%s: LNB power off\n", __FUNCTION__);
2277 if (polarity == 1) {
2282 if (polarity == 2) {
2287 WriteRegDW(adapter, 0x204, var);
2290 static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
2292 struct adapter *adapter = fe->before_after_data;
2297 printk("%s: FE_SLEEP\n", __FUNCTION__);
2299 set_tuner_polarity(adapter, 0);
2301 // return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
2305 case FE_SET_VOLTAGE:
2307 dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
2309 switch ((fe_sec_voltage_t) arg) {
2310 case SEC_VOLTAGE_13:
2312 printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
2314 set_tuner_polarity(adapter, 1);
2318 case SEC_VOLTAGE_18:
2320 printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
2322 set_tuner_polarity(adapter, 2);
2336 dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
2338 switch ((fe_sec_tone_mode_t) arg) {
2341 printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
2343 set_tuner_tone(adapter, 1);
2349 printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
2351 set_tuner_tone(adapter, 0);
2371 static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2373 struct adapter *adapter;
2374 struct dvb_adapter *dvb_adapter;
2375 struct dvb_demux *dvbdemux;
2382 if (DriverInitialize(pdev) != 0)
2385 dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
2387 if (dvb_adapter == NULL) {
2388 printk("%s: Error registering DVB adapter\n", __FUNCTION__);
2395 adapter = (struct adapter *) pci_get_drvdata(pdev);
2397 adapter->dvb_adapter = dvb_adapter;
2399 init_MUTEX(&adapter->i2c_sem);
2401 adapter->i2c_bus = dvb_register_i2c_bus(master_xfer, adapter, adapter->dvb_adapter, 0);
2403 if (!adapter->i2c_bus)
2406 dvb_add_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL, adapter);
2408 dvbdemux = &adapter->demux;
2410 dvbdemux->priv = (void *) adapter;
2411 dvbdemux->filternum = 32;
2412 dvbdemux->feednum = 32;
2413 dvbdemux->start_feed = dvb_start_feed;
2414 dvbdemux->stop_feed = dvb_stop_feed;
2415 dvbdemux->write_to_decoder = 0;
2416 dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING);
2418 dvb_dmx_init(&adapter->demux);
2420 adapter->hw_frontend.source = DMX_FRONTEND_0;
2422 adapter->dmxdev.filternum = 32;
2423 adapter->dmxdev.demux = &dvbdemux->dmx;
2424 adapter->dmxdev.capabilities = 0;
2426 dvb_dmxdev_init(&adapter->dmxdev, adapter->dvb_adapter);
2428 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
2432 adapter->mem_frontend.source = DMX_MEMORY_FE;
2434 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
2438 ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
2442 dvb_net_init(adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
2446 static void skystar2_remove(struct pci_dev *pdev)
2448 struct adapter *adapter;
2449 struct dvb_demux *dvbdemux;
2454 adapter = pci_get_drvdata(pdev);
2456 if (adapter != NULL) {
2457 dvb_net_release(&adapter->dvbnet);
2458 dvbdemux = &adapter->demux;
2460 dvbdemux->dmx.close(&dvbdemux->dmx);
2461 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
2462 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
2464 dvb_dmxdev_release(&adapter->dmxdev);
2465 dvb_dmx_release(&adapter->demux);
2467 if (adapter->dvb_adapter != NULL) {
2468 dvb_remove_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL);
2470 if (adapter->i2c_bus != NULL)
2471 dvb_unregister_i2c_bus(master_xfer, adapter->i2c_bus->adapter, adapter->i2c_bus->id);
2473 dvb_unregister_adapter(adapter->dvb_adapter);
2480 static struct pci_device_id skystar2_pci_tbl[] = {
2481 {0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
2485 static struct pci_driver skystar2_pci_driver = {
2486 .name = "Technisat SkyStar2 driver",
2487 .id_table = skystar2_pci_tbl,
2488 .probe = skystar2_probe,
2489 .remove = skystar2_remove,
2492 static int skystar2_init(void)
2494 return pci_module_init(&skystar2_pci_driver);
2497 static void skystar2_cleanup(void)
2499 pci_unregister_driver(&skystar2_pci_driver);
2502 module_init(skystar2_init);
2503 module_exit(skystar2_cleanup);
2505 MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
2506 MODULE_LICENSE("GPL");