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>
24 #include <linux/init.h>
29 #include "dvb_frontend.h"
30 #include "dvb_functions.h"
32 #include <linux/dvb/frontend.h>
33 #include <linux/dvb/dmx.h>
34 #include "dvb_demux.h"
36 #include "dvb_filter.h"
42 #define dprintk(x...) do { if (debug) printk(x); } while (0)
44 #define SizeOfBufDMA1 0x3AC00
45 #define SizeOfBufDMA2 0x758
56 struct packet_header {
59 u32 transport_error_indicator;
60 u32 payload_unit_start_indicator;
61 u32 transport_priority;
63 u32 transport_scrambling_control;
64 u32 adaptation_field_control;
65 u32 continuity_counter;
78 unsigned long io_port;
82 struct dvb_adapter *dvb_adapter;
83 struct dvb_demux demux;
85 struct dmx_frontend hw_frontend;
86 struct dmx_frontend mem_frontend;
87 struct dvb_i2c_bus *i2c_bus;
88 struct dvb_net dvbnet;
90 struct semaphore i2c_sem;
106 #define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
107 #define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
109 static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
113 tmp = ReadRegDW(adapter, reg);
118 tmp = tmp & andvalue;
120 tmp = (tmp & andvalue) | orvalue;
122 WriteRegDW(adapter, reg, tmp);
126 static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
131 WriteRegDW(adapter, 0x100, 0);
132 WriteRegDW(adapter, 0x100, command);
134 for (i = 0; i < retries; i++) {
135 value = ReadRegDW(adapter, 0x100);
137 if ((value & 0x40000000) == 0) {
138 if ((value & 0x81000000) == 0x80000000) {
140 *buf = (value >> 0x10) & 0xff;
147 WriteRegDW(adapter, 0x100, 0);
148 WriteRegDW(adapter, 0x100, command);
155 /* device = 0x10000000 for tuner, 0x20000000 for eeprom */
156 static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
158 *command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
161 *command = *command | 0x03000000;
163 *command = *command | 0x01000000;
166 static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
173 i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
175 result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
177 if ((result & 0xff) != 0) {
179 value = ReadRegDW(adapter, 0x104);
181 for (i = 1; i < len; i++) {
182 buf[i] = value & 0xff;
191 static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
200 for (i = len; i > 1; i--) {
202 value = value | buf[i - 1];
205 WriteRegDW(adapter, 0x104, value);
208 i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
210 return i2cMainWriteForFlex2(adapter, command, 0, 100000);
213 static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
215 if (device == 0x20000000)
216 *ret = bus | ((addr >> 8) & 3);
221 static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
224 u32 bytes_to_transfer;
227 // dprintk("%s:\n", __FUNCTION__);
232 bytes_to_transfer = len;
234 if (bytes_to_transfer > 4)
235 bytes_to_transfer = 4;
237 fixchipaddr(device, bus, addr, &chipaddr);
239 if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
242 buf = buf + bytes_to_transfer;
243 addr = addr + bytes_to_transfer;
244 len = len - bytes_to_transfer;
250 static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
253 u32 bytes_to_transfer;
256 // dprintk("%s:\n", __FUNCTION__);
261 bytes_to_transfer = len;
263 if (bytes_to_transfer > 4)
264 bytes_to_transfer = 4;
266 fixchipaddr(device, bus, addr, &chipaddr);
268 if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
271 buf = buf + bytes_to_transfer;
272 addr = addr + bytes_to_transfer;
273 len = len - bytes_to_transfer;
279 static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int num)
281 struct adapter *tmp = i2c->data;
284 if (down_interruptible(&tmp->i2c_sem))
288 dprintk("%s:\n", __FUNCTION__);
290 for (i = 0; i < num; i++) {
291 printk("message %d: flags=%x, addr=0x%04x, buf=%p, len=%d \n", i, msgs[i].flags, msgs[i].addr, msgs[i].buf, msgs[i].len);
295 /* allow only the vp310 frontend to access the bus */
296 if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
302 if ((num == 1) && (msgs[0].buf != NULL)) {
303 if (msgs[0].flags == I2C_M_RD) {
308 // single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
309 ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
311 if (ret != msgs[0].len - 1)
317 } else if ((num == 2) && (msgs[1].buf != NULL)) {
319 // i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
320 if (msgs[1].flags == I2C_M_RD) {
321 ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
325 ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
328 if (ret != msgs[1].len)
336 /* master xfer functions always return the number of successfully
337 transmitted messages, not the number of transmitted bytes.
338 return -EREMOTEIO in case of failure. */
342 /* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
343 but it seems that FlexCopII can work with more than one chip) */
344 static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
350 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
354 WriteRegDW(adapter, 0x714, tmp);
355 WriteRegDW(adapter, 0x714, tmp);
359 /* return value is never used? */
363 static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
369 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
374 WriteRegDW(adapter, 0x714, tmp);
375 WriteRegDW(adapter, 0x714, tmp);
379 /* return value is never used? */
383 static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
389 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
394 WriteRegDW(adapter, 0x714, tmp);
395 WriteRegDW(adapter, 0x714, tmp);
399 /* return value is never used? */
403 static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
409 tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
414 WriteRegDW(adapter, 0x714, tmp);
415 WriteRegDW(adapter, 0x714, tmp);
419 /* return value is never used? */
423 /* SRAM memory is accessed through a buffer register in the FlexCop
424 chip (0x700). This register has the following structure:
426 bit 15 : read/write flag
427 bits 16-23 : 8-bit word to write
429 bits 28-29 : memory bank selector
432 static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
434 u32 i, command, retries;
436 for (i = 0; i < len; i++) {
437 command = bank | addr | 0x04000000 | (*buf << 0x10);
441 while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
447 printk("%s: SRAM timeout\n", __FUNCTION__);
449 WriteRegDW(adapter, 0x700, command);
456 static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
458 u32 i, command, value, retries;
460 for (i = 0; i < len; i++) {
461 command = bank | addr | 0x04008000;
465 while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
471 printk("%s: SRAM timeout\n", __FUNCTION__);
473 WriteRegDW(adapter, 0x700, command);
477 while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
483 printk("%s: SRAM timeout\n", __FUNCTION__);
485 value = ReadRegDW(adapter, 0x700) >> 0x10;
487 *buf = (value & 0xff);
494 static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
500 if (adapter->dwSramType == 0x20000) {
501 bank = (addr & 0x18000) << 0x0D;
504 if (adapter->dwSramType == 0x00000) {
505 if ((addr >> 0x0F) == 0)
511 FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
514 static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
520 if (adapter->dwSramType == 0x20000) {
521 bank = (addr & 0x18000) << 0x0D;
524 if (adapter->dwSramType == 0x00000) {
525 if ((addr >> 0x0F) == 0)
531 FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
534 static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
541 // check if the address range belongs to the same
542 // 32K memory chip. If not, the data is read from
543 // one chip at a time.
544 if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
545 length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
548 SRAM_readChunk(adapter, addr, buf, length);
550 addr = addr + length;
556 static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
563 // check if the address range belongs to the same
564 // 32K memory chip. If not, the data is written to
565 // one chip at a time.
566 if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
567 length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
570 SRAM_writeChunk(adapter, addr, buf, length);
572 addr = addr + length;
578 static void SRAM_setSize(struct adapter *adapter, u32 mask)
580 WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
583 static void SRAM_init(struct adapter *adapter)
587 tmp = ReadRegDW(adapter, 0x71C);
589 WriteRegDW(adapter, 0x71C, 1);
591 if (ReadRegDW(adapter, 0x71C) != 0) {
592 WriteRegDW(adapter, 0x71C, tmp);
594 adapter->dwSramType = tmp & 0x30000;
596 dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
600 adapter->dwSramType = 0x10000;
602 dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
605 /* return value is never used? */
606 /* return adapter->dwSramType; */
609 static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
613 dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
615 SRAM_setSize(adapter, mask);
621 SRAM_write(adapter, addr, &tmp2, 1);
622 SRAM_write(adapter, addr + 4, &tmp1, 1);
628 SRAM_read(adapter, addr, &tmp2, 1);
629 SRAM_read(adapter, addr, &tmp2, 1);
631 dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
639 SRAM_write(adapter, addr, &tmp2, 1);
640 SRAM_write(adapter, addr + 4, &tmp1, 1);
646 SRAM_read(adapter, addr, &tmp2, 1);
647 SRAM_read(adapter, addr, &tmp2, 1);
649 dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
657 static u32 SRAM_length(struct adapter * adapter)
659 if (adapter->dwSramType == 0x10000)
661 if (adapter->dwSramType == 0x00000)
663 if (adapter->dwSramType == 0x20000)
664 return 131072; // 128K
669 /* FlexcopII can work with 32K, 64K or 128K of external SRAM memory.
670 - for 128K there are 4x32K chips at bank 0,1,2,3.
671 - for 64K there are 2x32K chips at bank 1,2.
672 - for 32K there is one 32K chip at bank 0.
674 FlexCop works only with one bank at a time. The bank is selected
675 by bits 28-29 of the 0x700 register.
677 bank 0 covers addresses 0x00000-0x07FFF
678 bank 1 covers addresses 0x08000-0x0FFFF
679 bank 2 covers addresses 0x10000-0x17FFF
680 bank 3 covers addresses 0x18000-0x1FFFF
682 static int SramDetectForFlex2(struct adapter *adapter)
686 dprintk("%s:\n", __FUNCTION__);
688 tmp = ReadRegDW(adapter, 0x208);
689 WriteRegDW(adapter, 0x208, 0);
691 tmp2 = ReadRegDW(adapter, 0x71C);
693 dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
695 WriteRegDW(adapter, 0x71C, 1);
697 tmp3 = ReadRegDW(adapter, 0x71C);
699 dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
701 WriteRegDW(adapter, 0x71C, tmp2);
703 // check for internal SRAM ???
706 SRAM_setSize(adapter, 0x10000);
708 WriteRegDW(adapter, 0x208, tmp);
710 dprintk("%s: sram size = 32K\n", __FUNCTION__);
715 if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
716 SRAM_setSize(adapter, 0x20000);
718 WriteRegDW(adapter, 0x208, tmp);
720 dprintk("%s: sram size = 128K\n", __FUNCTION__);
725 if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
726 SRAM_setSize(adapter, 0x00000);
728 WriteRegDW(adapter, 0x208, tmp);
730 dprintk("%s: sram size = 64K\n", __FUNCTION__);
735 if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
736 SRAM_setSize(adapter, 0x10000);
738 WriteRegDW(adapter, 0x208, tmp);
740 dprintk("%s: sram size = 32K\n", __FUNCTION__);
745 SRAM_setSize(adapter, 0x10000);
747 WriteRegDW(adapter, 0x208, tmp);
749 dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
754 static void SLL_detectSramSize(struct adapter *adapter)
756 SramDetectForFlex2(adapter);
758 /* EEPROM (Skystar2 has one "24LC08B" chip on board) */
760 static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
762 return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
766 static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
768 return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
771 u8 calc_LRC(u8 * buf, u32 len)
778 for (i = 0; i < len; i++)
784 static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
788 for (i = 0; i < retries; i++) {
789 if (EEPROM_read(adapter, addr, buf, len) == len) {
790 if (calc_LRC(buf, len - 1) == buf[len - 1])
799 static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
803 for (i = 0; i < retries; i++) {
804 if (EEPROM_write(adapter, addr, wbuf, len) == len) {
805 if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
814 /* These functions could be called from the initialization routine
815 to unlock SkyStar2 cards, locked by "Europe On Line".
817 in cards from "Europe On Line" the key is:
820 0xB2, 0x01, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00,
823 0x00, 0x00, 0x00, 0x00,
828 in unlocked cards the key is:
831 0xB2, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x00, 0x00,
840 static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
848 memcpy(wbuf, key, len);
853 wbuf[19] = calc_LRC(wbuf, 19);
855 return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
858 static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
865 if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
868 memcpy(key, buf, len);
873 static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
877 if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
915 static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
938 tmp[7] = calc_LRC(tmp, 7);
940 if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
948 static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
950 dprintk("%s: op=%x\n", __FUNCTION__, op);
953 WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
957 WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
961 static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
963 dprintk("%s: op=%x\n", __FUNCTION__, op);
966 WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
970 WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
974 static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
976 dprintk("%s: op=%x\n", __FUNCTION__, op);
979 WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
983 WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
987 static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
989 dprintk("%s: op=%x\n", __FUNCTION__, op);
992 WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
996 WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
1000 static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
1002 dprintk("%s: op=%x\n", __FUNCTION__, op);
1005 WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
1009 WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
1013 static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
1015 dprintk("%s: op=%x\n", __FUNCTION__, op);
1018 WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
1022 WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
1027 static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
1029 dprintk("%s: op=%x\n", __FUNCTION__, op);
1032 WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
1036 WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
1041 static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
1043 dprintk("%s: op=%x\n", __FUNCTION__, op);
1046 WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
1050 WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
1055 static void CtrlEnableMAC(struct adapter *adapter, u32 op)
1058 WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
1062 WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
1066 static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
1070 tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
1071 tmp2 = (mac[5] << 0x08) | mac[4];
1073 WriteRegDW(adapter, 0x418, tmp1);
1074 WriteRegDW(adapter, 0x41C, tmp2);
1080 static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
1083 WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
1085 adapter->mac_filter = 1;
1089 if (adapter->mac_filter != 0) {
1090 adapter->mac_filter = 0;
1092 WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
1099 static void CheckNullFilterEnable(struct adapter *adapter)
1101 FilterEnableNullFilter(adapter, 1);
1102 FilterEnableMaskFilter(adapter, 1);
1106 static void InitPIDsInfo(struct adapter *adapter)
1110 for (i = 0; i < 0x27; i++)
1111 adapter->pids[i] = 0x1FFF;
1114 static int CheckPID(struct adapter *adapter, u16 pid)
1121 for (i = 0; i < 0x27; i++) {
1122 if (adapter->pids[i] == pid)
1129 static void PidSetGroupPID(struct adapter * adapter, u32 pid)
1133 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1135 value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
1137 WriteRegDW(adapter, 0x30C, value);
1139 /* return value is never used? */
1143 static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
1147 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1149 value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
1151 WriteRegDW(adapter, 0x30C, value);
1153 /* return value is never used? */
1157 static void PidSetStream1PID(struct adapter * adapter, u32 pid)
1161 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1163 value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
1165 WriteRegDW(adapter, 0x300, value);
1167 /* return value is never used? */
1171 static void PidSetStream2PID(struct adapter * adapter, u32 pid)
1175 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1177 value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
1179 WriteRegDW(adapter, 0x300, value);
1181 /* return value is never used? */
1185 static void PidSetPcrPID(struct adapter * adapter, u32 pid)
1189 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1191 value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
1193 WriteRegDW(adapter, 0x304, value);
1195 /* return value is never used? */
1199 static void PidSetPmtPID(struct adapter * adapter, u32 pid)
1203 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1205 value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
1207 WriteRegDW(adapter, 0x304, value);
1209 /* return value is never used? */
1213 static void PidSetEmmPID(struct adapter * adapter, u32 pid)
1217 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1219 value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
1221 WriteRegDW(adapter, 0x308, value);
1223 /* return value is never used? */
1227 static void PidSetEcmPID(struct adapter * adapter, u32 pid)
1231 dprintk("%s: pid=%x\n", __FUNCTION__, pid);
1233 value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
1235 WriteRegDW(adapter, 0x308, value);
1237 /* return value is never used? */
1241 static int PidGetStream1PID(struct adapter * adapter)
1243 return ReadRegDW(adapter, 0x300) & 0x00001FFF;
1246 static int PidGetStream2PID(struct adapter * adapter)
1248 return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
1251 static int PidGetPcrPID(struct adapter * adapter)
1253 return ReadRegDW(adapter, 0x304) & 0x00001FFF;
1256 static int PidGetPmtPID(struct adapter * adapter)
1258 return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
1261 static int PidGetEmmPID(struct adapter * adapter)
1263 return ReadRegDW(adapter, 0x308) & 0x00001FFF;
1266 static int PidGetEcmPID(struct adapter * adapter)
1268 return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
1271 static int PidGetGroupPID(struct adapter * adapter)
1273 return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
1276 static int PidGetGroupMASK(struct adapter * adapter)
1278 return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
1282 static void ResetHardwarePIDFilter(struct adapter *adapter)
1284 PidSetStream1PID(adapter, 0x1FFF);
1286 PidSetStream2PID(adapter, 0x1FFF);
1287 FilterEnableStream2Filter(adapter, 0);
1289 PidSetPcrPID(adapter, 0x1FFF);
1290 FilterEnablePcrFilter(adapter, 0);
1292 PidSetPmtPID(adapter, 0x1FFF);
1293 FilterEnablePmtFilter(adapter, 0);
1295 PidSetEcmPID(adapter, 0x1FFF);
1296 FilterEnableEcmFilter(adapter, 0);
1298 PidSetEmmPID(adapter, 0x1FFF);
1299 FilterEnableEmmFilter(adapter, 0);
1303 static void OpenWholeBandwidth(struct adapter *adapter)
1305 PidSetGroupPID(adapter, 0);
1307 PidSetGroupMASK(adapter, 0);
1309 FilterEnableMaskFilter(adapter, 1);
1312 static int AddHwPID(struct adapter *adapter, u32 pid)
1314 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1319 if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
1322 if (PidGetStream1PID(adapter) == 0x1FFF) {
1323 PidSetStream1PID(adapter, pid & 0xFFFF);
1325 FilterEnableStream1Filter(adapter, 1);
1330 if (PidGetStream2PID(adapter) == 0x1FFF) {
1331 PidSetStream2PID(adapter, (pid & 0xFFFF));
1333 FilterEnableStream2Filter(adapter, 1);
1338 if (PidGetPcrPID(adapter) == 0x1FFF) {
1339 PidSetPcrPID(adapter, (pid & 0xFFFF));
1341 FilterEnablePcrFilter(adapter, 1);
1346 if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
1347 PidSetPmtPID(adapter, (pid & 0xFFFF));
1349 FilterEnablePmtFilter(adapter, 1);
1354 if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
1355 PidSetEmmPID(adapter, (pid & 0xFFFF));
1357 FilterEnableEmmFilter(adapter, 1);
1362 if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
1363 PidSetEcmPID(adapter, (pid & 0xFFFF));
1365 FilterEnableEcmFilter(adapter, 1);
1373 static int RemoveHwPID(struct adapter *adapter, u32 pid)
1375 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1380 if (PidGetStream1PID(adapter) == pid) {
1381 PidSetStream1PID(adapter, 0x1FFF);
1386 if (PidGetStream2PID(adapter) == pid) {
1387 PidSetStream2PID(adapter, 0x1FFF);
1389 FilterEnableStream2Filter(adapter, 0);
1394 if (PidGetPcrPID(adapter) == pid) {
1395 PidSetPcrPID(adapter, 0x1FFF);
1397 FilterEnablePcrFilter(adapter, 0);
1402 if (PidGetPmtPID(adapter) == pid) {
1403 PidSetPmtPID(adapter, 0x1FFF);
1405 FilterEnablePmtFilter(adapter, 0);
1410 if (PidGetEmmPID(adapter) == pid) {
1411 PidSetEmmPID(adapter, 0x1FFF);
1413 FilterEnableEmmFilter(adapter, 0);
1418 if (PidGetEcmPID(adapter) == pid) {
1419 PidSetEcmPID(adapter, 0x1FFF);
1421 FilterEnableEcmFilter(adapter, 0);
1429 static int AddPID(struct adapter *adapter, u32 pid)
1433 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1438 if (CheckPID(adapter, pid) == 1)
1441 for (i = 0; i < 0x27; i++) {
1442 if (adapter->pids[i] == 0x1FFF) // find free pid filter
1444 adapter->pids[i] = pid;
1446 if (AddHwPID(adapter, pid) < 0)
1447 OpenWholeBandwidth(adapter);
1456 static int RemovePID(struct adapter *adapter, u32 pid)
1460 dprintk("%s: pid=%d\n", __FUNCTION__, pid);
1465 for (i = 0; i < 0x27; i++) {
1466 if (adapter->pids[i] == pid) {
1467 adapter->pids[i] = 0x1FFF;
1469 RemoveHwPID(adapter, pid);
1479 static void CtrlEnableSmc(struct adapter *adapter, u32 op)
1482 WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
1486 WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
1490 static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
1492 adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
1496 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00010000;
1498 adapter->dma_ctrl = adapter->dma_ctrl | 0x00010000;
1501 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00020000;
1503 adapter->dma_ctrl = adapter->dma_ctrl | 0x00020000;
1508 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00040000;
1510 adapter->dma_ctrl = adapter->dma_ctrl | 0x00040000;
1513 adapter->dma_ctrl = adapter->dma_ctrl & ~0x00080000;
1515 adapter->dma_ctrl = adapter->dma_ctrl | 0x00080000;
1519 static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
1523 value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
1526 value = value | (adapter->dma_ctrl & 0x000F0000);
1528 WriteRegDW(adapter, 0x208, value);
1531 /* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
1534 The DMA1 buffer is divided in 2 subbuffers of equal size.
1535 FlexCopII will transfer TS data to one subbuffer, signal an interrupt
1536 when the subbuffer is full and continue fillig the second subbuffer.
1539 subbuffer size in 32-bit words is stored in the first 24 bits of
1540 register 0x004. The last 8 bits of register 0x004 contain the number
1543 the first 30 bits of register 0x000 contain the address of the first
1544 subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
1545 when dma1 is enabled.
1547 the first 30 bits of register 0x00C contain the address of the second
1548 subbuffer. the last 2 bits contain 1.
1550 register 0x008 will contain the address of the subbuffer that was filled
1551 with TS data, when FlexCopII will generate an interrupt.
1554 subbuffer size in 32-bit words is stored in the first 24 bits of
1555 register 0x014. The last 8 bits of register 0x014 contain the number
1558 the first 30 bits of register 0x010 contain the address of the first
1559 subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
1560 when dma1 is enabled.
1562 the first 30 bits of register 0x01C contain the address of the second
1563 subbuffer. the last 2 bits contain 1.
1565 register 0x018 contains the address of the subbuffer that was filled
1566 with TS data, when FlexCopII generates an interrupt.
1568 static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
1570 u32 subbuffers, subbufsize, subbuf0, subbuf1;
1572 if (dma_channel == 0) {
1573 dprintk("%s: Initializing DMA1 channel\n", __FUNCTION__);
1577 subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
1579 subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
1581 subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
1583 dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
1585 WriteRegDW(adapter, 0x000, subbuf0);
1587 dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
1589 WriteRegDW(adapter, 0x004, subbufsize);
1591 dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
1593 WriteRegDW(adapter, 0x00C, subbuf1);
1595 dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
1596 WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
1599 if (subbuffers == 0)
1600 DmaEnableDisableIrq(adapter, 0, 1, 0);
1602 DmaEnableDisableIrq(adapter, 0, 1, 1);
1604 IrqDmaEnableDisableIrq(adapter, 1);
1606 SRAMSetMediaDest(adapter, 1);
1607 SRAMSetNetDest(adapter, 1);
1608 SRAMSetCaiDest(adapter, 2);
1609 SRAMSetCaoDest(adapter, 2);
1612 if (dma_channel == 1) {
1613 dprintk("%s: Initializing DMA2 channel\n", __FUNCTION__);
1617 subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
1619 subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
1621 subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
1623 dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
1625 WriteRegDW(adapter, 0x010, subbuf0);
1627 dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
1629 WriteRegDW(adapter, 0x014, subbufsize);
1631 dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
1633 WriteRegDW(adapter, 0x01C, subbuf1);
1635 SRAMSetCaiDest(adapter, 2);
1641 static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
1644 WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
1646 adapter->dma_status = adapter->dma_status & ~0x00000004;
1650 WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
1652 adapter->dma_status = adapter->dma_status | 0x00000004;
1656 /* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
1657 bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
1659 static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
1661 u32 dma_enable, dma1_enable, dma2_enable;
1663 dprintk("%s: dma_mask=%x\n", __FUNCTION__, dma_mask);
1665 if (start_stop == 1) {
1666 dprintk("%s: starting dma\n", __FUNCTION__);
1671 if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) == 0) && (adapter->dmaq1.bus_addr != 0)) {
1672 adapter->dma_status = adapter->dma_status | 1;
1676 if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) == 0) && (adapter->dmaq2.bus_addr != 0)) {
1677 adapter->dma_status = adapter->dma_status | 2;
1680 // enable dma1 and dma2
1681 if ((dma1_enable == 1) && (dma2_enable == 1)) {
1682 WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
1683 WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
1684 WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
1686 CtrlEnableReceiveData(adapter, 1);
1691 if ((dma1_enable == 1) && (dma2_enable == 0)) {
1692 WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
1693 WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
1695 CtrlEnableReceiveData(adapter, 1);
1700 if ((dma1_enable == 0) && (dma2_enable == 1)) {
1701 WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
1703 CtrlEnableReceiveData(adapter, 1);
1708 if ((dma1_enable == 0) && (dma2_enable == 0)) {
1709 CtrlEnableReceiveData(adapter, 1);
1716 dprintk("%s: stoping dma\n", __FUNCTION__);
1718 dma_enable = adapter->dma_status & 0x00000003;
1720 if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
1721 dma_enable = dma_enable & 0xFFFFFFFE;
1724 if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
1725 dma_enable = dma_enable & 0xFFFFFFFD;
1728 if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
1729 CtrlEnableReceiveData(adapter, 0);
1734 if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
1735 WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
1736 WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
1738 adapter->dma_status = adapter->dma_status & ~0x00000001;
1741 if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
1742 WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
1744 adapter->dma_status = adapter->dma_status & ~0x00000002;
1749 static void OpenStream(struct adapter *adapter, u32 pid)
1753 if (adapter->capturing == 0)
1754 adapter->capturing = 1;
1756 FilterEnableMaskFilter(adapter, 1);
1758 AddPID(adapter, pid);
1760 dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
1762 if ((adapter->dma_status & 7) != 7) {
1765 if (((adapter->dma_status & 0x10000000) != 0) && ((adapter->dma_status & 1) == 0)) {
1766 dma_mask = dma_mask | 1;
1768 adapter->dmaq1.head = 0;
1769 adapter->dmaq1.tail = 0;
1771 memset(adapter->dmaq1.buffer, 0, adapter->dmaq1.buffer_size);
1774 if (((adapter->dma_status & 0x20000000) != 0) && ((adapter->dma_status & 2) == 0)) {
1775 dma_mask = dma_mask | 2;
1777 adapter->dmaq2.head = 0;
1778 adapter->dmaq2.tail = 0;
1781 if (dma_mask != 0) {
1782 IrqDmaEnableDisableIrq(adapter, 1);
1784 DmaStartStop0x2102(adapter, dma_mask, 1);
1789 static void CloseStream(struct adapter *adapter, u32 pid)
1793 if (adapter->capturing != 0)
1794 adapter->capturing = 0;
1796 dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
1800 if ((adapter->dma_status & 1) != 0)
1801 dma_mask = dma_mask | 0x00000001;
1802 if ((adapter->dma_status & 2) != 0)
1803 dma_mask = dma_mask | 0x00000002;
1805 if (dma_mask != 0) {
1806 DmaStartStop0x2102(adapter, dma_mask, 0);
1809 RemovePID(adapter, pid);
1812 static void InterruptServiceDMA1(struct adapter *adapter)
1814 struct dvb_demux *dvbdmx = &adapter->demux;
1815 struct packet_header packet_header;
1818 u32 nNumBytesParsed;
1819 u32 nNumNewBytesTransferred;
1820 u32 dwDefaultPacketSize = 188;
1821 u8 gbTmpBuffer[188];
1824 nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
1825 nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
1827 if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
1828 dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
1832 adapter->dmaq1.head = nCurDmaCounter;
1834 if (adapter->dmaq1.tail <= nCurDmaCounter) {
1835 nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
1839 nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
1842 // dprintk("%s: nCurDmaCounter = %d\n" , __FUNCTION__, nCurDmaCounter);
1843 // dprintk("%s: dmaq1.tail = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
1844 // dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
1846 if (nNumNewBytesTransferred < dwDefaultPacketSize)
1849 nNumBytesParsed = 0;
1851 while (nNumBytesParsed < nNumNewBytesTransferred) {
1852 pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
1854 if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
1855 memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
1856 memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
1858 pbDMABufCurPos = gbTmpBuffer;
1861 if (adapter->capturing != 0) {
1862 u32 *dq = (u32 *) pbDMABufCurPos;
1864 packet_header.sync_byte = *dq & 0x000000FF;
1865 packet_header.transport_error_indicator = *dq & 0x00008000;
1866 packet_header.payload_unit_start_indicator = *dq & 0x00004000;
1867 packet_header.transport_priority = *dq & 0x00002000;
1868 packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
1869 packet_header.transport_scrambling_control = *dq >> 0x1E;
1870 packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
1871 packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
1873 if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
1874 if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
1875 dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
1879 // dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
1884 nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
1886 adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
1888 if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
1889 adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
1893 static void InterruptServiceDMA2(struct adapter *adapter)
1895 printk("%s:\n", __FUNCTION__);
1898 static irqreturn_t isr(int irq, void *dev_id, struct pt_regs *regs)
1900 struct adapter *tmp = dev_id;
1904 // dprintk("%s:\n", __FUNCTION__);
1906 spin_lock_irq(&tmp->lock);
1908 if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
1909 spin_unlock_irq(&tmp->lock);
1913 while (value != 0) {
1914 if ((value & 0x03) != 0)
1915 InterruptServiceDMA1(tmp);
1916 if ((value & 0x0C) != 0)
1917 InterruptServiceDMA2(tmp);
1918 value = ReadRegDW(tmp, 0x20C) & 0x0F;
1921 spin_unlock_irq(&tmp->lock);
1925 static void Initdmaqueue(struct adapter *adapter)
1927 dma_addr_t dma_addr;
1929 if (adapter->dmaq1.buffer != 0)
1932 adapter->dmaq1.head = 0;
1933 adapter->dmaq1.tail = 0;
1934 adapter->dmaq1.buffer = 0;
1936 adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
1938 if (adapter->dmaq1.buffer != 0) {
1939 memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
1941 adapter->dmaq1.bus_addr = dma_addr;
1942 adapter->dmaq1.buffer_size = SizeOfBufDMA1;
1944 DmaInitDMA(adapter, 0);
1946 adapter->dma_status = adapter->dma_status | 0x10000000;
1948 dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SizeOfBufDMA1);
1952 adapter->dma_status = adapter->dma_status & ~0x10000000;
1955 if (adapter->dmaq2.buffer != 0)
1958 adapter->dmaq2.head = 0;
1959 adapter->dmaq2.tail = 0;
1960 adapter->dmaq2.buffer = 0;
1962 adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
1964 if (adapter->dmaq2.buffer != 0) {
1965 memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
1967 adapter->dmaq2.bus_addr = dma_addr;
1968 adapter->dmaq2.buffer_size = SizeOfBufDMA2;
1970 DmaInitDMA(adapter, 1);
1972 adapter->dma_status = adapter->dma_status | 0x20000000;
1974 dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
1978 adapter->dma_status = adapter->dma_status & ~0x20000000;
1982 static void Freedmaqueue(struct adapter *adapter)
1984 if (adapter->dmaq1.buffer != 0) {
1985 pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
1987 adapter->dmaq1.bus_addr = 0;
1988 adapter->dmaq1.head = 0;
1989 adapter->dmaq1.tail = 0;
1990 adapter->dmaq1.buffer_size = 0;
1991 adapter->dmaq1.buffer = 0;
1994 if (adapter->dmaq2.buffer != 0) {
1995 pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
1997 adapter->dmaq2.bus_addr = 0;
1998 adapter->dmaq2.head = 0;
1999 adapter->dmaq2.tail = 0;
2000 adapter->dmaq2.buffer_size = 0;
2001 adapter->dmaq2.buffer = 0;
2005 static void FreeAdapterObject(struct adapter *adapter)
2007 dprintk("%s:\n", __FUNCTION__);
2009 CloseStream(adapter, 0);
2011 if (adapter->irq != 0)
2012 free_irq(adapter->irq, adapter);
2014 Freedmaqueue(adapter);
2016 if (adapter->io_mem != 0)
2017 iounmap((void *) adapter->io_mem);
2023 static struct pci_driver skystar2_pci_driver;
2025 static int ClaimAdapter(struct adapter *adapter)
2027 struct pci_dev *pdev = adapter->pdev;
2031 if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), skystar2_pci_driver.name))
2034 if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), skystar2_pci_driver.name))
2037 pci_read_config_byte(pdev, PCI_CLASS_REVISION, &adapter->card_revision);
2039 dprintk("%s: card revision %x \n", __FUNCTION__, adapter->card_revision);
2041 if (pci_enable_device(pdev))
2044 pci_read_config_word(pdev, 4, &var);
2047 pci_set_master(pdev);
2049 adapter->io_port = pdev->resource[1].start;
2051 adapter->io_mem = (unsigned long) ioremap(pdev->resource[0].start, 0x800);
2053 if (adapter->io_mem == 0) {
2054 dprintk("%s: can not map io memory\n", __FUNCTION__);
2059 dprintk("%s: io memory maped at %lx\n", __FUNCTION__, adapter->io_mem);
2065 static int SLL_reset_FlexCOP(struct adapter *adapter)
2067 WriteRegDW(adapter, 0x208, 0);
2068 WriteRegDW(adapter, 0x210, 0xB2FF);
2074 static int DriverInitialize(struct pci_dev * pdev)
2076 struct adapter *adapter;
2080 if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
2081 dprintk("%s: out of memory!\n", __FUNCTION__);
2086 memset(adapter, 0, sizeof(struct adapter));
2088 pci_set_drvdata(pdev,adapter);
2090 adapter->pdev = pdev;
2091 adapter->irq = pdev->irq;
2093 if ((ClaimAdapter(adapter)) != 1) {
2094 FreeAdapterObject(adapter);
2099 IrqDmaEnableDisableIrq(adapter, 0);
2101 if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
2102 dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
2104 FreeAdapterObject(adapter);
2109 ReadRegDW(adapter, 0x208);
2110 WriteRegDW(adapter, 0x208, 0);
2111 WriteRegDW(adapter, 0x210, 0xB2FF);
2112 WriteRegDW(adapter, 0x208, 0x40);
2114 InitPIDsInfo(adapter);
2116 PidSetGroupPID(adapter, 0);
2117 PidSetGroupMASK(adapter, 0x1FE0);
2118 PidSetStream1PID(adapter, 0x1FFF);
2119 PidSetStream2PID(adapter, 0x1FFF);
2120 PidSetPmtPID(adapter, 0x1FFF);
2121 PidSetPcrPID(adapter, 0x1FFF);
2122 PidSetEcmPID(adapter, 0x1FFF);
2123 PidSetEmmPID(adapter, 0x1FFF);
2125 Initdmaqueue(adapter);
2127 if ((adapter->dma_status & 0x30000000) == 0) {
2128 FreeAdapterObject(adapter);
2133 adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
2135 if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
2136 if (adapter->b2c2_revision != 0x82) {
2137 dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
2138 dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
2140 FreeAdapterObject(adapter);
2145 tmp = ReadRegDW(adapter, 0x204);
2147 WriteRegDW(adapter, 0x204, 0);
2150 WriteRegDW(adapter, 0x204, tmp);
2153 tmp = ReadRegDW(adapter, 0x308);
2154 WriteRegDW(adapter, 0x308, 0x4000 | tmp);
2156 adapter->dwSramType = 0x10000;
2158 SLL_detectSramSize(adapter);
2160 dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
2162 SRAMSetMediaDest(adapter, 1);
2163 SRAMSetNetDest(adapter, 1);
2165 CtrlEnableSmc(adapter, 0);
2167 SRAMSetCaiDest(adapter, 2);
2168 SRAMSetCaoDest(adapter, 2);
2170 DmaEnableDisableIrq(adapter, 1, 0, 0);
2172 if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
2173 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]
2176 CASetMacDstAddrFilter(adapter, adapter->mac_addr);
2177 CtrlEnableMAC(adapter, 1);
2180 EEPROM_readKey(adapter, key, 16);
2182 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]);
2184 adapter->lock = SPIN_LOCK_UNLOCKED;
2189 static void DriverHalt(struct pci_dev *pdev)
2191 struct adapter *adapter;
2193 adapter = pci_get_drvdata(pdev);
2195 IrqDmaEnableDisableIrq(adapter, 0);
2197 CtrlEnableReceiveData(adapter, 0);
2199 FreeAdapterObject(adapter);
2201 pci_set_drvdata(pdev, NULL);
2203 release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
2205 release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
2208 static int dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
2210 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
2211 struct adapter *adapter = (struct adapter *) dvbdmx->priv;
2213 dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
2215 OpenStream(adapter, dvbdmxfeed->pid);
2220 static int dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
2222 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
2223 struct adapter *adapter = (struct adapter *) dvbdmx->priv;
2225 dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
2227 CloseStream(adapter, dvbdmxfeed->pid);
2233 static void set_tuner_tone(struct adapter *adapter, u8 tone)
2235 u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
2238 dprintk("%s: %u\n", __FUNCTION__, tone);
2242 ax = wzHalfPeriodFor45MHz[0];
2245 ax = wzHalfPeriodFor45MHz[1];
2248 ax = wzHalfPeriodFor45MHz[2];
2251 ax = wzHalfPeriodFor45MHz[3];
2259 WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
2263 WriteRegDW(adapter, 0x200, 0x40FF8000);
2267 static void set_tuner_polarity(struct adapter *adapter, u8 polarity)
2271 dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
2273 var = ReadRegDW(adapter, 0x204);
2275 if (polarity == 0) {
2276 dprintk("%s: LNB power off\n", __FUNCTION__);
2280 if (polarity == 1) {
2285 if (polarity == 2) {
2290 WriteRegDW(adapter, 0x204, var);
2293 static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
2295 struct adapter *adapter = fe->before_after_data;
2300 printk("%s: FE_SLEEP\n", __FUNCTION__);
2302 set_tuner_polarity(adapter, 0);
2304 // return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
2308 case FE_SET_VOLTAGE:
2310 dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
2312 switch ((fe_sec_voltage_t) arg) {
2313 case SEC_VOLTAGE_13:
2315 printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
2317 set_tuner_polarity(adapter, 1);
2321 case SEC_VOLTAGE_18:
2323 printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
2325 set_tuner_polarity(adapter, 2);
2339 dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
2341 switch ((fe_sec_tone_mode_t) arg) {
2344 printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
2346 set_tuner_tone(adapter, 1);
2352 printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
2354 set_tuner_tone(adapter, 0);
2374 static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2376 struct adapter *adapter;
2377 struct dvb_adapter *dvb_adapter;
2378 struct dvb_demux *dvbdemux;
2385 if (DriverInitialize(pdev) != 0)
2388 dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
2390 if (dvb_adapter == NULL) {
2391 printk("%s: Error registering DVB adapter\n", __FUNCTION__);
2398 adapter = (struct adapter *) pci_get_drvdata(pdev);
2400 adapter->dvb_adapter = dvb_adapter;
2402 init_MUTEX(&adapter->i2c_sem);
2404 adapter->i2c_bus = dvb_register_i2c_bus(master_xfer, adapter, adapter->dvb_adapter, 0);
2406 if (!adapter->i2c_bus)
2409 dvb_add_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL, adapter);
2411 dvbdemux = &adapter->demux;
2413 dvbdemux->priv = (void *) adapter;
2414 dvbdemux->filternum = 32;
2415 dvbdemux->feednum = 32;
2416 dvbdemux->start_feed = dvb_start_feed;
2417 dvbdemux->stop_feed = dvb_stop_feed;
2418 dvbdemux->write_to_decoder = 0;
2419 dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING);
2421 dvb_dmx_init(&adapter->demux);
2423 adapter->hw_frontend.source = DMX_FRONTEND_0;
2425 adapter->dmxdev.filternum = 32;
2426 adapter->dmxdev.demux = &dvbdemux->dmx;
2427 adapter->dmxdev.capabilities = 0;
2429 dvb_dmxdev_init(&adapter->dmxdev, adapter->dvb_adapter);
2431 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
2435 adapter->mem_frontend.source = DMX_MEMORY_FE;
2437 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
2441 ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
2445 dvb_net_init(adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
2449 static void skystar2_remove(struct pci_dev *pdev)
2451 struct adapter *adapter;
2452 struct dvb_demux *dvbdemux;
2457 adapter = pci_get_drvdata(pdev);
2459 if (adapter != NULL) {
2460 dvb_net_release(&adapter->dvbnet);
2461 dvbdemux = &adapter->demux;
2463 dvbdemux->dmx.close(&dvbdemux->dmx);
2464 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
2465 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
2467 dvb_dmxdev_release(&adapter->dmxdev);
2468 dvb_dmx_release(&adapter->demux);
2470 if (adapter->dvb_adapter != NULL) {
2471 dvb_remove_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL);
2473 if (adapter->i2c_bus != NULL)
2474 dvb_unregister_i2c_bus(master_xfer, adapter->i2c_bus->adapter, adapter->i2c_bus->id);
2476 dvb_unregister_adapter(adapter->dvb_adapter);
2483 static struct pci_device_id skystar2_pci_tbl[] = {
2484 {0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
2488 static struct pci_driver skystar2_pci_driver = {
2489 .name = "Technisat SkyStar2 driver",
2490 .id_table = skystar2_pci_tbl,
2491 .probe = skystar2_probe,
2492 .remove = skystar2_remove,
2495 static int skystar2_init(void)
2497 return pci_module_init(&skystar2_pci_driver);
2500 static void skystar2_cleanup(void)
2502 pci_unregister_driver(&skystar2_pci_driver);
2505 module_init(skystar2_init);
2506 module_exit(skystar2_cleanup);
2508 MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
2509 MODULE_LICENSE("GPL");