57 #include <linux/module.h>
58 #include <linux/slab.h>
60 #include <linux/atmdev.h>
62 #include <asm/byteorder.h>
64 #include <linux/pci.h>
77 #define NUM_VCI (1024)
94 #define FULL_MEMORY_TEST
101 #define SERVICE_ENTRIES (1024)
118 #define TX_FIFO_DEPTH (7)
125 #define LANAI_POLL_PERIOD (10*HZ)
132 #define AAL5_RX_MULTIPLIER (3)
138 #define AAL5_TX_MULTIPLIER (3)
146 #define AAL0_TX_MULTIPLIER (40)
153 #define AAL0_RX_BUFFER_SIZE (PAGE_SIZE)
164 #define DEV_LABEL "lanai"
168 #define DPRINTK(format, args...) \
169 printk(KERN_DEBUG DEV_LABEL ": " format, ##args)
170 #define APRINTK(truth, format, args...) \
172 if (unlikely(!(truth))) \
173 printk(KERN_ERR DEV_LABEL ": " format, ##args); \
178 #define DPRINTK(format, args...)
179 #define APRINTK(truth, format, args...)
184 #define RWDEBUG(format, args...) \
185 printk(KERN_DEBUG DEV_LABEL ": " format, ##args)
187 #define RWDEBUG(format, args...)
192 #define LANAI_MAPPING_SIZE (0x40000)
193 #define LANAI_EEPROM_SIZE (128)
306 static void vci_bitfield_iterate(
struct lanai_dev *lanai,
307 const unsigned long *
lp,
323 #define LANAI_PAGE_SIZE ((PAGE_SIZE >= 1024) ? PAGE_SIZE : 1024)
337 if (bytes > (128 * 1024))
353 "bad dmaaddr: 0x%lx\n",
362 }
while (size >= minbytes);
368 return ((
unsigned long) buf->
end) - ((
unsigned long) buf->
start);
371 static void lanai_buf_deallocate(
struct lanai_buffer *buf,
382 static int lanai_buf_size_cardorder(
const struct lanai_buffer *buf)
397 #define RESET_GET_BOARD_REV(x) (((x)>> 0)&0x03)
398 #define RESET_GET_BOARD_ID(x) (((x)>> 2)&0x03)
399 #define BOARD_ID_LANAI256 (0)
410 #define STATUS_PROMDATA (0x00000001)
411 #define STATUS_WAITING (0x00000002)
412 #define STATUS_SOOL (0x00000004)
413 #define STATUS_LOCD (0x00000008)
414 #define STATUS_LED (0x00000010)
415 #define STATUS_GPIN (0x00000020)
416 #define STATUS_BUTTBUSY (0x00000040)
418 #define CONFIG1_PROMDATA (0x00000001)
419 #define CONFIG1_PROMCLK (0x00000002)
420 #define CONFIG1_SET_READMODE(x) ((x)*0x004)
421 #define READMODE_PLAIN (0)
422 #define READMODE_LINE (2)
423 #define READMODE_MULTIPLE (3)
424 #define CONFIG1_DMA_ENABLE (0x00000010)
425 #define CONFIG1_POWERDOWN (0x00000020)
426 #define CONFIG1_SET_LOOPMODE(x) ((x)*0x080)
427 #define LOOPMODE_NORMAL (0)
428 #define LOOPMODE_TIME (1)
429 #define LOOPMODE_DIAG (2)
430 #define LOOPMODE_LINE (3)
431 #define CONFIG1_MASK_LOOPMODE (0x00000180)
432 #define CONFIG1_SET_LEDMODE(x) ((x)*0x0200)
433 #define LEDMODE_NOT_SOOL (0)
434 #define LEDMODE_OFF (1)
435 #define LEDMODE_ON (2)
436 #define LEDMODE_NOT_LOCD (3)
437 #define LEDMORE_GPIN (4)
438 #define LEDMODE_NOT_GPIN (7)
439 #define CONFIG1_MASK_LEDMODE (0x00000E00)
440 #define CONFIG1_GPOUT1 (0x00001000)
441 #define CONFIG1_GPOUT2 (0x00002000)
442 #define CONFIG1_GPOUT3 (0x00004000)
444 #define CONFIG2_HOWMANY (0x00000001)
445 #define CONFIG2_PTI7_MODE (0x00000002)
446 #define CONFIG2_VPI_CHK_DIS (0x00000004)
447 #define CONFIG2_HEC_DROP (0x00000008)
448 #define CONFIG2_VCI0_NORMAL (0x00000010)
449 #define CONFIG2_CBR_ENABLE (0x00000020)
450 #define CONFIG2_TRASH_ALL (0x00000040)
451 #define CONFIG2_TX_DISABLE (0x00000080)
452 #define CONFIG2_SET_TRASH (0x00000100)
454 #define STATS_GET_FIFO_OVFL(x) (((x)>> 0)&0xFF)
455 #define STATS_GET_HEC_ERR(x) (((x)>> 8)&0xFF)
456 #define STATS_GET_BAD_VCI(x) (((x)>>16)&0xFF)
457 #define STATS_GET_BUF_OVFL(x) (((x)>>24)&0xFF)
459 #define SSTUFF_SET_SIZE(x) ((x)*0x20000000)
460 #define SSTUFF_SET_ADDR(x) ((x)>>8)
482 RWDEBUG(
"R [0x%08X] 0x%02X = 0x%08X\n", (
unsigned int) lanai->
base,
490 RWDEBUG(
"W [0x%08X] 0x%02X < 0x%08X\n", (
unsigned int) lanai->
base,
495 static inline void conf1_write(
const struct lanai_dev *lanai)
500 static inline void conf2_write(
const struct lanai_dev *lanai)
506 static inline void conf2_write_if_powerup(
const struct lanai_dev *lanai)
515 static inline void reset_board(
const struct lanai_dev *lanai)
517 DPRINTK(
"about to reset board\n");
535 #define SRAM_START (0x20000)
536 #define SRAM_BYTES (0x20000)
545 return readl(sram_addr(lanai, offset));
548 static inline void sram_write(
const struct lanai_dev *lanai,
551 writel(val, sram_addr(lanai, offset));
558 sram_write(lanai, pattern, offset);
559 readback = sram_read(lanai, offset);
560 if (
likely(readback == pattern))
563 "(itf %d): SRAM word at %d bad: wrote 0x%X, read 0x%X\n",
565 (
unsigned int) pattern, (
unsigned int) readback);
572 for (offset = 0; offset <
SRAM_BYTES && result == 0; offset += 4)
573 result = sram_test_word(lanai, offset, pattern);
579 #ifdef FULL_MEMORY_TEST
582 if ((result = sram_test_pass(lanai, 0x5555)) != 0)
584 if ((result = sram_test_pass(lanai, 0xAAAA)) != 0)
588 return sram_test_pass(lanai, 0x0000);
596 #define RXADDR1_SET_SIZE(x) ((x)*0x0000100)
597 #define RXADDR1_SET_RMMODE(x) ((x)*0x00800)
598 #define RMMODE_TRASH (0)
599 #define RMMODE_PRESERVE (1)
600 #define RMMODE_PIPE (2)
601 #define RMMODE_PIPEALL (3)
602 #define RXADDR1_OAM_PRESERVE (0x00002000)
603 #define RXADDR1_SET_MODE(x) ((x)*0x0004000)
604 #define RXMODE_TRASH (0)
605 #define RXMODE_AAL0 (1)
606 #define RXMODE_AAL5 (2)
607 #define RXMODE_AAL5_STREAM (3)
612 #define RXWRITEPTR_LASTEFCI (0x00002000)
613 #define RXWRITEPTR_DROPPING (0x00004000)
614 #define RXWRITEPTR_TRASHING (0x00008000)
616 #define RXBUFSTART_CLP (0x00004000)
617 #define RXBUFSTART_CI (0x00008000)
621 #define TXADDR1_SET_SIZE(x) ((x)*0x0000100)
622 #define TXADDR1_ABR (0x00008000)
627 #define TXREADPTR_GET_PTR(x) ((x)&0x01FFF)
628 #define TXREADPTR_MASK_DELTA (0x0000E000)
630 #define TXENDPTR_CLP (0x00002000)
631 #define TXENDPTR_MASK_PDUMODE (0x0000C000)
632 #define PDUMODE_AAL0 (0*0x04000)
633 #define PDUMODE_AAL5 (2*0x04000)
634 #define PDUMODE_AAL5STREAM (3*0x04000)
636 #define TXWRITEPTR_GET_PTR(x) ((x)&0x1FFF)
638 #define TXCBR_NEXT_BOZO (0x00008000)
641 #define CARDVCC_SIZE (0x40)
649 static inline u32 cardvcc_read(
const struct lanai_vcc *lvcc,
655 RWDEBUG(
"VR vci=%04d 0x%02X = 0x%08X\n",
656 lvcc->
vci, (
int) offset, val);
660 static inline void cardvcc_write(
const struct lanai_vcc *lvcc,
665 "cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)\n",
666 (
unsigned int) val, lvcc->
vci, (
unsigned int) offset);
667 RWDEBUG(
"VW vci=%04d 0x%02X > 0x%08X\n",
668 lvcc->
vci, (
unsigned int) offset, (
unsigned int) val);
678 static inline int aal5_size(
int size)
680 int cells = (size + 8 + 47) / 48;
687 static inline int aal5_spacefor(
int space)
689 int cells = space / 48;
698 atmvcc->
pop(atmvcc, skb);
705 static void host_vcc_start_rx(
const struct lanai_vcc *lvcc)
715 cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF,
vcc_rxaddr2);
716 addr1 = ((dmaaddr >> 8) & 0xFF) |
729 static void host_vcc_start_tx(
const struct lanai_vcc *lvcc)
739 (lvcc->
tx.atmvcc->qos.txtp.traffic_class ==
ATM_CBR) ?
741 cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF,
vcc_txaddr2);
743 ((dmaaddr >> 8) & 0xFF) |
749 static void lanai_shutdown_rx_vci(
const struct lanai_vcc *lvcc)
774 static void lanai_shutdown_tx_vci(
struct lanai_dev *lanai,
781 "lanai_shutdown_tx_vci called w/o process context!\n");
786 lanai_free_skb(lvcc->
tx.atmvcc, skb);
796 (((lanai_buf_size(&lvcc->
tx.buf) / 1024) *
HZ) >> 7);
801 (lvcc->
tx.atmvcc->qos.txtp.traffic_class !=
ATM_CBR ||
803 TXCBR_NEXT_BOZO) == 0))
805 if (read != lastread) {
811 "backlog closing vci %d\n",
812 lvcc->
tx.atmvcc->dev->number, lvcc->
vci);
813 DPRINTK(
"read, write = %d, %d\n", read, write);
830 static inline int aal0_buffer_allocate(
struct lanai_dev *lanai)
832 DPRINTK(
"aal0_buffer_allocate: allocating AAL0 RX buffer\n");
838 static inline void aal0_buffer_free(
struct lanai_dev *lanai)
840 DPRINTK(
"aal0_buffer_allocate: freeing AAL0 RX buffer\n");
841 lanai_buf_deallocate(&lanai->
aal0buf, lanai->
pci);
847 #define EEPROM_COPYRIGHT (0)
848 #define EEPROM_COPYRIGHT_LEN (44)
849 #define EEPROM_CHECKSUM (62)
850 #define EEPROM_CHECKSUM_REV (63)
851 #define EEPROM_MAC (64)
852 #define EEPROM_MAC_REV (70)
853 #define EEPROM_SERIAL (112)
854 #define EEPROM_SERIAL_REV (116)
855 #define EEPROM_MAGIC (120)
856 #define EEPROM_MAGIC_REV (124)
858 #define EEPROM_MAGIC_VALUE (0x5AB478D2)
885 #define set_config1(x) do { lanai->conf1 = x; conf1_write(lanai); \
887 #define clock_h() set_config1(lanai->conf1 | CONFIG1_PROMCLK)
888 #define clock_l() set_config1(lanai->conf1 &~ CONFIG1_PROMCLK)
889 #define data_h() set_config1(lanai->conf1 | CONFIG1_PROMDATA)
890 #define data_l() set_config1(lanai->conf1 &~ CONFIG1_PROMDATA)
891 #define pre_read() do { data_h(); clock_h(); udelay(5); } while (0)
892 #define read_pin() (reg_read(lanai, Status_Reg) & STATUS_PROMDATA)
893 #define send_stop() do { data_l(); udelay(5); clock_h(); udelay(5); \
894 data_h(); udelay(5); } while (0)
896 data_h(); clock_h();
udelay(5);
898 data = (address << 1) | 1;
902 for (i = 128; i != 0; i >>= 1) {
905 if (lanai->
conf1 != tmp) {
912 data_h(); clock_h();
udelay(5);
917 for (data = 0, i = 7; i >= 0; i--) {
918 data_h(); clock_h();
udelay(5);
919 data = (data << 1) | !!read_pin();
923 data_h(); clock_h();
udelay(5);
929 DPRINTK(
"EEPROM 0x%04X %02X\n",
930 (
unsigned int) address, (
unsigned int) data);
950 static inline u32 eeprom_be4(
const struct lanai_dev *lanai,
int address)
965 if (e[i] < 0x20 || e[i] > 0x7E)
969 DPRINTK(
"eeprom: copyright = \"%s\"\n",
972 DPRINTK(
"eeprom: copyright not found\n");
978 if (s != e[EEPROM_CHECKSUM]) {
980 "(wanted 0x%02X, got 0x%02X)\n", lanai->
number,
981 (
unsigned int) s, (
unsigned int) e[EEPROM_CHECKSUM]);
987 "bad (wanted 0x%02X, got 0x%02X)\n", lanai->
number,
988 (
unsigned int) s, (
unsigned int) e[EEPROM_CHECKSUM_REV]);
992 for (i = 0; i < 6; i++)
995 "(itf %d) : EEPROM MAC addresses don't match "
996 "(0x%02X, inverse 0x%02X)\n", lanai->
number,
1005 if ((lanai->
serialno ^ v) != 0xFFFFFFFF) {
1007 "don't match (0x%08X, inverse 0x%08X)\n", lanai->
number,
1008 (
unsigned int) lanai->
serialno, (
unsigned int) v);
1011 DPRINTK(
"eeprom: Serial number = %d\n", (
unsigned int) lanai->
serialno);
1015 if ((lanai->
magicno ^ v) != 0xFFFFFFFF) {
1017 "don't match (0x%08X, inverse 0x%08X)\n", lanai->
number,
1024 "magic not what expected (got 0x%08X, not 0x%08X)\n",
1032 static inline const u8 *eeprom_mac(
const struct lanai_dev *lanai)
1040 #define INT_STATS (0x00000002)
1041 #define INT_SOOL (0x00000004)
1042 #define INT_LOCD (0x00000008)
1043 #define INT_LED (0x00000010)
1044 #define INT_GPIN (0x00000020)
1045 #define INT_PING (0x00000040)
1046 #define INT_WAKE (0x00000080)
1047 #define INT_CBR0 (0x00000100)
1048 #define INT_LOCK (0x00000200)
1049 #define INT_MISMATCH (0x00000400)
1050 #define INT_AAL0_STR (0x00000800)
1051 #define INT_AAL0 (0x00001000)
1052 #define INT_SERVICE (0x00002000)
1053 #define INT_TABORTSENT (0x00004000)
1054 #define INT_TABORTBM (0x00008000)
1055 #define INT_TIMEOUTBM (0x00010000)
1056 #define INT_PCIPARITY (0x00020000)
1059 #define INT_ALL (0x0003FFFE)
1060 #define INT_STATUS (0x0000003C)
1061 #define INT_DMASHUT (0x00038000)
1062 #define INT_SEGSHUT (0x00000700)
1064 static inline u32 intr_pending(
const struct lanai_dev *lanai)
1074 static inline void intr_disable(
const struct lanai_dev *lanai,
u32 i)
1081 static void status_message(
int itf,
const char *
name,
int status)
1083 static const char *
onoff[2] = {
"off to on",
"on to off" };
1085 itf, name, onoff[!status]);
1088 static void lanai_check_status(
struct lanai_dev *lanai)
1093 #define e(flag, name) \
1094 if (changes & flag) \
1095 status_message(lanai->number, name, new & flag)
1103 static void pcistatus_got(
int itf,
const char *
name)
1108 static void pcistatus_check(
struct lanai_dev *lanai,
int clearonly)
1115 "%d\n", lanai->
number, result);
1126 "%d\n", lanai->
number, result);
1129 #define e(flag, name, stat) \
1131 pcistatus_got(lanai->number, name); \
1132 ++lanai->stats.pcierr_##stat; \
1146 static inline int vcc_tx_space(
const struct lanai_vcc *lvcc,
int endptr)
1150 r -= ((
unsigned long) lvcc->
tx.buf.ptr) -
1151 ((
unsigned long) lvcc->
tx.buf.start);
1154 r += lanai_buf_size(&lvcc->
tx.buf);
1159 static inline int vcc_is_backlogged(
const struct lanai_vcc *lvcc)
1161 return !skb_queue_empty(&lvcc->
tx.backlog);
1165 #define DESCRIPTOR_MAGIC (0xD0000000)
1166 #define DESCRIPTOR_AAL5 (0x00008000)
1167 #define DESCRIPTOR_AAL5_STREAM (0x00004000)
1168 #define DESCRIPTOR_CLP (0x00002000)
1171 static inline void vcc_tx_add_aal5_descriptor(
struct lanai_vcc *lvcc,
1175 APRINTK((((
unsigned long) lvcc->
tx.buf.ptr) & 15) == 0,
1176 "vcc_tx_add_aal5_descriptor: bad ptr=%p\n", lvcc->
tx.buf.ptr);
1177 lvcc->
tx.buf.ptr += 4;
1178 pos = ((
unsigned char *) lvcc->
tx.buf.ptr) -
1179 (
unsigned char *) lvcc->
tx.buf.start;
1180 APRINTK((pos & ~0x0001FFF0) == 0,
1181 "vcc_tx_add_aal5_descriptor: bad pos (%d) before, vci=%d, "
1182 "start,ptr,end=%p,%p,%p\n",
pos, lvcc->
vci,
1183 lvcc->
tx.buf.start, lvcc->
tx.buf.ptr, lvcc->
tx.buf.end);
1184 pos = (pos +
len) & (lanai_buf_size(&lvcc->
tx.buf) - 1);
1185 APRINTK((pos & ~0x0001FFF0) == 0,
1186 "vcc_tx_add_aal5_descriptor: bad pos (%d) after, vci=%d, "
1187 "start,ptr,end=%p,%p,%p\n", pos, lvcc->
vci,
1188 lvcc->
tx.buf.start, lvcc->
tx.buf.ptr, lvcc->
tx.buf.end);
1189 lvcc->
tx.buf.ptr[-1] =
1193 if (lvcc->
tx.buf.ptr >= lvcc->
tx.buf.end)
1194 lvcc->
tx.buf.ptr = lvcc->
tx.buf.start;
1198 static inline void vcc_tx_add_aal5_trailer(
struct lanai_vcc *lvcc,
1201 APRINTK((((
unsigned long) lvcc->
tx.buf.ptr) & 15) == 8,
1202 "vcc_tx_add_aal5_trailer: bad ptr=%p\n", lvcc->
tx.buf.ptr);
1203 lvcc->
tx.buf.ptr += 2;
1204 lvcc->
tx.buf.ptr[-2] =
cpu_to_be32((uu << 24) | (cpi << 16) | len);
1205 if (lvcc->
tx.buf.ptr >= lvcc->
tx.buf.end)
1206 lvcc->
tx.buf.ptr = lvcc->
tx.buf.start;
1209 static inline void vcc_tx_memcpy(
struct lanai_vcc *lvcc,
1210 const unsigned char *
src,
int n)
1214 e = ((
unsigned char *) lvcc->
tx.buf.ptr) +
n;
1215 m = e - (
unsigned char *) lvcc->
tx.buf.end;
1218 memcpy(lvcc->
tx.buf.ptr, src, n - m);
1220 memcpy(lvcc->
tx.buf.start, src + n - m, m);
1221 e = ((
unsigned char *) lvcc->
tx.buf.start) +
m;
1223 lvcc->
tx.buf.ptr = (
u32 *) e;
1226 static inline void vcc_tx_memzero(
struct lanai_vcc *lvcc,
int n)
1232 e = ((
unsigned char *) lvcc->
tx.buf.ptr) +
n;
1233 m = e - (
unsigned char *) lvcc->
tx.buf.end;
1236 memset(lvcc->
tx.buf.ptr, 0, n - m);
1239 e = ((
unsigned char *) lvcc->
tx.buf.start) +
m;
1241 lvcc->
tx.buf.ptr = (
u32 *) e;
1245 static inline void lanai_endtx(
struct lanai_dev *lanai,
1248 int i,
ptr = ((
unsigned char *) lvcc->
tx.buf.ptr) -
1249 (
unsigned char *) lvcc->
tx.buf.start;
1250 APRINTK((ptr & ~0x0001FFF0) == 0,
1251 "lanai_endtx: bad ptr (%d), vci=%d, start,ptr,end=%p,%p,%p\n",
1252 ptr, lvcc->
vci, lvcc->
tx.buf.start, lvcc->
tx.buf.ptr,
1271 "always busy!\n", lanai->
number);
1290 static void lanai_send_one_aal5(
struct lanai_dev *lanai,
1295 "lanai_send_one_aal5: wrong size packet (%d != %d)\n",
1296 pdusize, aal5_size(skb->
len));
1297 vcc_tx_add_aal5_descriptor(lvcc, 0, pdusize);
1298 pad = pdusize - skb->
len - 8;
1299 APRINTK(pad >= 0,
"pad is negative (%d)\n", pad);
1300 APRINTK(pad < 48,
"pad is too big (%d)\n", pad);
1301 vcc_tx_memcpy(lvcc, skb->
data, skb->
len);
1302 vcc_tx_memzero(lvcc, pad);
1303 vcc_tx_add_aal5_trailer(lvcc, skb->
len, 0, 0);
1304 lanai_endtx(lanai, lvcc);
1305 lanai_free_skb(lvcc->
tx.atmvcc, skb);
1310 static void vcc_tx_unqueue_aal5(
struct lanai_dev *lanai,
1315 int space = vcc_tx_space(lvcc, endptr);
1316 APRINTK(vcc_is_backlogged(lvcc),
1317 "vcc_tx_unqueue() called with empty backlog (vci=%d)\n",
1319 while (space >= 64) {
1323 n = aal5_size(skb->
len);
1324 if (n + 16 > space) {
1329 lanai_send_one_aal5(lanai, lvcc, skb, n);
1332 if (!vcc_is_backlogged(lvcc)) {
1343 if (vcc_is_backlogged(lvcc))
1345 space = vcc_tx_space(lvcc,
1347 n = aal5_size(skb->
len);
1348 APRINTK(n + 16 >= 64,
"vcc_tx_aal5: n too small (%d)\n", n);
1349 if (space < n + 16) {
1355 lanai_send_one_aal5(lanai, lvcc, skb, n);
1358 static void vcc_tx_unqueue_aal0(
struct lanai_dev *lanai,
1362 ": vcc_tx_unqueue_aal0: not implemented\n");
1370 lanai_free_skb(lvcc->
tx.atmvcc, skb);
1376 static inline void vcc_rx_memcpy(
unsigned char *
dest,
1379 int m = ((
const unsigned char *) lvcc->
rx.buf.ptr) + n -
1380 ((
const unsigned char *) (lvcc->
rx.buf.end));
1383 memcpy(dest, lvcc->
rx.buf.ptr, n - m);
1384 memcpy(dest + n - m, lvcc->
rx.buf.start, m);
1390 static void vcc_rx_aal5(
struct lanai_vcc *lvcc,
int endptr)
1395 u32 *
end = &lvcc->
rx.buf.start[endptr * 4];
1396 int n = ((
unsigned long) end) - ((
unsigned long) lvcc->
rx.buf.ptr);
1398 n += lanai_buf_size(&lvcc->
rx.buf);
1399 APRINTK(n >= 0 && n < lanai_buf_size(&lvcc->
rx.buf) && !(n & 15),
1400 "vcc_rx_aal5: n out of range (%d/%Zu)\n",
1401 n, lanai_buf_size(&lvcc->
rx.buf));
1403 if ((x = &end[-2]) < lvcc->
rx.buf.start)
1404 x = &lvcc->
rx.buf.end[-2];
1411 if (
unlikely(n != aal5_size(size))) {
1414 "on vci=%d - size=%d n=%d\n",
1415 lvcc->
rx.atmvcc->dev->number, lvcc->
vci, size, n);
1416 lvcc->
stats.x.aal5.rx_badlen++;
1421 lvcc->
stats.rx_nomem++;
1425 vcc_rx_memcpy(skb->
data, lvcc, size);
1427 __net_timestamp(skb);
1428 lvcc->
rx.atmvcc->push(lvcc->
rx.atmvcc, skb);
1431 lvcc->
rx.buf.ptr =
end;
1435 static void vcc_rx_aal0(
struct lanai_dev *lanai)
1445 #if (NUM_VCI * BITS_PER_LONG) <= PAGE_SIZE
1446 #define VCCTABLE_GETFREEPAGE
1453 #ifdef VCCTABLE_GETFREEPAGE
1455 "vcc table > PAGE_SIZE!");
1467 static inline void vcc_table_deallocate(
const struct lanai_dev *lanai)
1469 #ifdef VCCTABLE_GETFREEPAGE
1477 static inline struct lanai_vcc *new_lanai_vcc(
void)
1482 skb_queue_head_init(&lvcc->
tx.backlog);
1490 static int lanai_get_sized_buffer(
struct lanai_dev *lanai,
1497 max_sdu = aal5_size(max_sdu);
1498 size = (max_sdu + 16) * multiplier + 16;
1499 lanai_buf_allocate(buf, size, max_sdu + 32, lanai->
pci);
1502 if (
unlikely(lanai_buf_size(buf) < size))
1504 "for %s buffer, got only %Zu\n", lanai->
number, size,
1505 name, lanai_buf_size(buf));
1506 DPRINTK(
"Allocated %Zu byte %s buffer\n", lanai_buf_size(buf), name);
1511 static inline int lanai_setup_rx_vci_aal5(
struct lanai_dev *lanai,
1514 return lanai_get_sized_buffer(lanai, &lvcc->
rx.buf,
1522 int max_sdu, multiplier;
1524 lvcc->
tx.unqueue = vcc_tx_unqueue_aal0;
1528 lvcc->
tx.unqueue = vcc_tx_unqueue_aal5;
1529 max_sdu = qos->
txtp.max_sdu;
1532 return lanai_get_sized_buffer(lanai, &lvcc->
tx.buf, max_sdu,
1536 static inline void host_vcc_bind(
struct lanai_dev *lanai,
1541 DPRINTK(
"Binding vci %d\n", vci);
1542 #ifdef USE_POWERDOWN
1543 if (lanai->nbound++ == 0) {
1544 DPRINTK(
"Coming out of powerdown\n");
1550 lvcc->
vbase = cardvcc_addr(lanai, vci);
1554 static inline void host_vcc_unbind(
struct lanai_dev *lanai,
1562 #ifdef USE_POWERDOWN
1563 if (--lanai->nbound == 0) {
1564 DPRINTK(
"Going into powerdown\n");
1573 static void lanai_reset(
struct lanai_dev *lanai)
1576 "implemented\n", lanai->
number);
1583 lanai->
stats.card_reset++;
1597 DPRINTK(
"allocated service buffer at 0x%08lX, size %Zu(%d)\n",
1598 (
unsigned long) lanai->
service.start,
1599 lanai_buf_size(&lanai->
service),
1600 lanai_buf_size_cardorder(&lanai->
service));
1611 static inline void service_buffer_deallocate(
struct lanai_dev *lanai)
1613 lanai_buf_deallocate(&lanai->
service, lanai->
pci);
1617 #define SERVICE_TX (0x80000000)
1618 #define SERVICE_TRASH (0x40000000)
1619 #define SERVICE_CRCERR (0x20000000)
1620 #define SERVICE_CI (0x10000000)
1621 #define SERVICE_CLP (0x08000000)
1622 #define SERVICE_STREAM (0x04000000)
1623 #define SERVICE_GET_VCI(x) (((x)>>16)&0x3FF)
1624 #define SERVICE_GET_END(x) ((x)&0x1FFF)
1629 static int handle_service(
struct lanai_dev *lanai,
u32 s)
1637 DPRINTK(
"(itf %d) got service entry 0x%X for nonexistent "
1638 "vcc %d\n", lanai->
number, (
unsigned int) s, vci);
1640 lanai->
stats.service_notx++;
1642 lanai->
stats.service_norx++;
1648 DPRINTK(
"(itf %d) got service entry 0x%X for non-TX "
1649 "vcc %d\n", lanai->
number, (
unsigned int) s, vci);
1650 lanai->
stats.service_notx++;
1660 DPRINTK(
"(itf %d) got service entry 0x%X for non-RX "
1661 "vcc %d\n", lanai->
number, (
unsigned int) s, vci);
1662 lanai->
stats.service_norx++;
1667 DPRINTK(
"(itf %d) got RX service entry 0x%X for non-AAL5 "
1668 "vcc %d\n", lanai->
number, (
unsigned int) s, vci);
1669 lanai->
stats.service_rxnotaal5++;
1681 DPRINTK(
"got trashed rx pdu on vci %d\n", vci);
1683 lvcc->
stats.x.aal5.service_trash++;
1685 (((
unsigned long) lvcc->
rx.buf.ptr) -
1686 ((
unsigned long) lvcc->
rx.buf.start)) + 47;
1688 bytes += lanai_buf_size(&lvcc->
rx.buf);
1689 lanai->
stats.ovfl_trash += (bytes / 48);
1695 lvcc->
stats.x.aal5.service_stream++;
1697 "PDU on VCI %d!\n", lanai->
number, vci);
1701 DPRINTK(
"got rx crc error on vci %d\n", vci);
1703 lvcc->
stats.x.aal5.service_rxcrc++;
1714 if (vcc_is_backlogged(lvcc))
1715 lvcc->
tx.unqueue(lanai, lvcc, lvcc->
tx.endptr);
1722 static void run_service(
struct lanai_dev *lanai)
1727 while (lanai->
service.ptr != end) {
1728 ntx += handle_service(lanai,
1736 vci_bitfield_iterate(lanai, lanai->transmit_ready,
1738 bitmap_zero(lanai->transmit_ready,
NUM_VCI);
1745 static void get_statistics(
struct lanai_dev *lanai)
1762 if (lvcc ==
NULL || lvcc->
tx.atmvcc ==
NULL ||
1763 !vcc_is_backlogged(lvcc)) {
1768 lvcc->
tx.unqueue(lanai, lvcc, endptr);
1772 static void lanai_timed_poll(
unsigned long arg)
1776 unsigned long flags;
1777 #ifdef USE_POWERDOWN
1790 vci_bitfield_iterate(lanai, lanai->backlog_vccs, iter_dequeue);
1794 get_statistics(lanai);
1799 static inline void lanai_timed_poll_start(
struct lanai_dev *lanai)
1803 lanai->
timer.data = (
unsigned long) lanai;
1804 lanai->
timer.function = lanai_timed_poll;
1808 static inline void lanai_timed_poll_stop(
struct lanai_dev *lanai)
1832 reason &= ~INT_STATS;
1833 get_statistics(lanai);
1837 lanai_check_status(lanai);
1841 "shutdown, reason=0x%08X, address=0x%08X\n",
1842 lanai->
number, (
unsigned int) (reason & INT_DMASHUT),
1852 lanai->
stats.dma_reenable++;
1853 pcistatus_check(lanai, 0);
1859 pcistatus_check(lanai, 0);
1863 "segmentation shutdown, reason=0x%08X\n", lanai->
number,
1864 (
unsigned int) (reason & INT_SEGSHUT));
1870 "unexpected interrupt 0x%08X, resetting\n",
1878 DPRINTK(
"unacked ints: 0x%08X\n",
1879 (
unsigned int) (reason & ~ack));
1893 #ifdef USE_POWERDOWN
1903 reason = intr_pending(lanai);
1908 if (
unlikely(reason == 0xFFFFFFFF))
1910 lanai_int_1(lanai, reason);
1911 reason = intr_pending(lanai);
1912 }
while (reason != 0);
1928 static int check_board_id_and_rev(
const char *name,
u32 val,
int *revp)
1930 DPRINTK(
"%s says board_id=%d, board_rev=%d\n", name,
1952 "PCI device", lanai->
number);
1958 "(itf %d): No suitable DMA available.\n", lanai->
number);
1961 if (pci_set_consistent_dma_mask(pci,
DMA_BIT_MASK(32)) != 0) {
1963 "(itf %d): No suitable DMA available.\n", lanai->
number);
1973 "PCI_LATENCY_TIMER: %d\n", lanai->
number, result);
1976 pcistatus_check(lanai, 1);
1977 pcistatus_check(lanai, 0);
1989 static inline int vci0_is_ok(
struct lanai_dev *lanai,
1994 if (qos->rxtp.traffic_class !=
ATM_NONE) {
1995 if (lanai->
naal0 != 0)
1998 conf2_write_if_powerup(lanai);
2011 if (vci == 0 && !vci0_is_ok(lanai, qos))
2014 if (qos->rxtp.traffic_class !=
ATM_NONE &&
2015 lvcc->
rx.atmvcc !=
NULL && lvcc->
rx.atmvcc != atmvcc)
2018 lvcc->
tx.atmvcc !=
NULL && lvcc->
tx.atmvcc != atmvcc)
2025 qos->rxtp.traffic_class !=
ATM_NONE) {
2030 conf2_write_if_powerup(lanai);
2035 static int lanai_normalize_ci(
struct lanai_dev *lanai,
2036 const struct atm_vcc *atmvcc,
short *vpip,
vci_t *vcip)
2051 if (vci_is_ok(lanai, *vcip, atmvcc))
2055 if (*vcip >= lanai->
num_vci || *vcip < 0 ||
2056 !vci_is_ok(lanai, *vcip, atmvcc))
2069 #define CBRICG_FRAC_BITS (4)
2070 #define CBRICG_MAX (2046 << CBRICG_FRAC_BITS)
2087 static int pcr_to_cbricg(
const struct atm_qos *qos)
2104 DPRINTK(
"pcr_to_cbricg: pcr=%d rounddown=%c icg=%d\n",
2105 pcr, rounddown ?
'Y' :
'N', icg);
2109 static inline void lanai_cbr_setup(
struct lanai_dev *lanai)
2117 static inline void lanai_cbr_shutdown(
struct lanai_dev *lanai)
2129 unsigned long raw_base;
2132 DPRINTK(
"In lanai_dev_open()\n");
2136 bitmap_zero(lanai->backlog_vccs,
NUM_VCI);
2137 bitmap_zero(lanai->transmit_ready,
NUM_VCI);
2139 #ifdef USE_POWERDOWN
2153 if ((result = lanai_pci_start(lanai)) != 0)
2155 raw_base = lanai->
pci->resource[0].start;
2180 result = check_board_id_and_rev(
"register",
2186 if ((result = eeprom_read(lanai)) != 0)
2188 if ((result = eeprom_validate(lanai)) != 0)
2200 if ((result = sram_test_and_clear(lanai)) != 0)
2206 if ((result = service_buffer_allocate(lanai)) != 0)
2208 if ((result = vcc_table_allocate(lanai)) != 0)
2216 DEV_LABEL, lanai)) != 0) {
2218 goto error_vcctable;
2229 #ifdef USE_POWERDOWN
2234 lanai_timed_poll_start(lanai);
2236 "(%pMF)\n", lanai->
number, (
int) lanai->
pci->revision,
2237 (
unsigned long) lanai->
base, lanai->
pci->irq, atmdev->
esi);
2239 "board_rev=%d\n", lanai->
number,
2245 vcc_table_deallocate(lanai);
2247 service_buffer_deallocate(lanai);
2250 #ifdef USE_POWERDOWN
2264 static void lanai_dev_close(
struct atm_dev *atmdev)
2269 lanai_timed_poll_stop(lanai);
2270 #ifdef USE_POWERDOWN
2277 #ifdef USE_POWERDOWN
2282 vcc_table_deallocate(lanai);
2283 service_buffer_deallocate(lanai);
2289 static void lanai_close(
struct atm_vcc *atmvcc)
2297 if (lvcc->
rx.atmvcc == atmvcc) {
2298 lanai_shutdown_rx_vci(lvcc);
2300 if (--lanai->
naal0 <= 0)
2301 aal0_buffer_free(lanai);
2303 lanai_buf_deallocate(&lvcc->
rx.buf, lanai->
pci);
2306 if (lvcc->
tx.atmvcc == atmvcc) {
2307 if (atmvcc == lanai->
cbrvcc) {
2309 lanai_cbr_shutdown(lanai);
2312 lanai_shutdown_tx_vci(lanai, lvcc);
2313 lanai_buf_deallocate(&lvcc->
tx.buf, lanai->
pci);
2316 if (--lvcc->
nref == 0) {
2317 host_vcc_unbind(lanai, lvcc);
2325 static int lanai_open(
struct atm_vcc *atmvcc)
2330 int vci = atmvcc->
vci;
2331 short vpi = atmvcc->
vpi;
2337 result = lanai_normalize_ci(lanai, atmvcc, &vpi, &vci);
2345 lvcc = lanai->
vccs[vci];
2347 lvcc = new_lanai_vcc();
2354 APRINTK(lvcc->
rx.atmvcc ==
NULL,
"rx.atmvcc!=NULL, vci=%d\n",
2357 if (lanai->
naal0 == 0)
2358 result = aal0_buffer_allocate(lanai);
2360 result = lanai_setup_rx_vci_aal5(
2361 lanai, lvcc, &atmvcc->
qos);
2364 lvcc->
rx.atmvcc = atmvcc;
2365 lvcc->
stats.rx_nomem = 0;
2366 lvcc->
stats.x.aal5.rx_badlen = 0;
2367 lvcc->
stats.x.aal5.service_trash = 0;
2368 lvcc->
stats.x.aal5.service_stream = 0;
2369 lvcc->
stats.x.aal5.service_rxcrc = 0;
2374 APRINTK(lvcc->
tx.atmvcc ==
NULL,
"tx.atmvcc!=NULL, vci=%d\n",
2376 result = lanai_setup_tx_vci(lanai, lvcc, &atmvcc->
qos);
2379 lvcc->
tx.atmvcc = atmvcc;
2380 if (atmvcc->
qos.txtp.traffic_class ==
ATM_CBR) {
2382 "cbrvcc!=NULL, vci=%d\n", vci);
2386 host_vcc_bind(lanai, lvcc, vci);
2392 if (atmvcc == lvcc->
rx.atmvcc)
2393 host_vcc_start_rx(lvcc);
2394 if (atmvcc == lvcc->
tx.atmvcc) {
2395 host_vcc_start_tx(lvcc);
2396 if (lanai->
cbrvcc == atmvcc)
2397 lanai_cbr_setup(lanai);
2402 lanai_close(atmvcc);
2407 static int lanai_send(
struct atm_vcc *atmvcc,
struct sk_buff *skb)
2411 unsigned long flags;
2413 lvcc->
tx.atmvcc != atmvcc))
2417 DPRINTK(
"lanai_send: skb==NULL for vci=%d\n", atmvcc->
vci);
2421 DPRINTK(
"lanai_send: lanai==NULL for vci=%d\n", atmvcc->
vci);
2426 switch (atmvcc->
qos.aal) {
2429 vcc_tx_aal5(lanai, lvcc, skb);
2438 vcc_tx_aal0(lanai, lvcc, skb);
2442 DPRINTK(
"lanai_send: bad aal=%d on vci=%d\n", (
int) atmvcc->
qos.aal,
2445 lanai_free_skb(atmvcc, skb);
2449 static int lanai_change_qos(
struct atm_vcc *atmvcc,
2450 struct atm_qos *qos,
int flags)
2455 #ifndef CONFIG_PROC_FS
2456 #define lanai_proc_read NULL
2464 return sprintf(page, DEV_LABEL
"(itf %d): chip=LANAI%s, "
2465 "serial=%u, magic=0x%08X, num_vci=%d\n",
2470 return sprintf(page,
"revision: board=%d, pci_if=%d\n",
2473 return sprintf(page,
"EEPROM ESI: %pM\n",
2476 return sprintf(page,
"status: SOOL=%d, LOCD=%d, LED=%d, "
2482 return sprintf(page,
"global buffer sizes: service=%Zu, "
2483 "aal0_rx=%Zu\n", lanai_buf_size(&lanai->
service),
2486 get_statistics(lanai);
2487 return sprintf(page,
"cells in error: overflow=%u, "
2488 "closed_vci=%u, bad_HEC=%u, rx_fifo=%u\n",
2489 lanai->
stats.ovfl_trash, lanai->
stats.vci_trash,
2490 lanai->
stats.hec_err, lanai->
stats.atm_ovfl);
2493 return sprintf(page,
"PCI errors: parity_detect=%u, "
2494 "master_abort=%u, master_target_abort=%u,\n",
2495 lanai->
stats.pcierr_parity_detect,
2496 lanai->
stats.pcierr_serr_set,
2497 lanai->
stats.pcierr_m_target_abort);
2499 return sprintf(page,
" slave_target_abort=%u, "
2500 "master_parity=%u\n", lanai->
stats.pcierr_s_target_abort,
2501 lanai->
stats.pcierr_master_parity);
2503 return sprintf(page,
" no_tx=%u, "
2504 "no_rx=%u, bad_rx_aal=%u\n", lanai->
stats.service_norx,
2505 lanai->
stats.service_notx,
2506 lanai->
stats.service_rxnotaal5);
2508 return sprintf(page,
"resets: dma=%u, card=%u\n",
2509 lanai->
stats.dma_reenable, lanai->
stats.card_reset);
2524 if (lvcc->
rx.atmvcc !=
NULL) {
2525 left +=
sprintf(&page[left],
",\n rx_AAL=%d",
2526 lvcc->
rx.atmvcc->qos.aal ==
ATM_AAL5 ? 5 : 0);
2528 left +=
sprintf(&page[left],
", rx_buf_size=%Zu, "
2529 "rx_bad_len=%u,\n rx_service_trash=%u, "
2530 "rx_service_stream=%u, rx_bad_crc=%u",
2531 lanai_buf_size(&lvcc->
rx.buf),
2532 lvcc->
stats.x.aal5.rx_badlen,
2533 lvcc->
stats.x.aal5.service_trash,
2534 lvcc->
stats.x.aal5.service_stream,
2535 lvcc->
stats.x.aal5.service_rxcrc);
2537 if (lvcc->
tx.atmvcc !=
NULL)
2538 left +=
sprintf(&page[left],
",\n tx_AAL=%d, "
2539 "tx_buf_size=%Zu, tx_qos=%cBR, tx_backlogged=%c",
2540 lvcc->
tx.atmvcc->qos.aal ==
ATM_AAL5 ? 5 : 0,
2541 lanai_buf_size(&lvcc->
tx.buf),
2542 lvcc->
tx.atmvcc == lanai->
cbrvcc ?
'C' :
'U',
2543 vcc_is_backlogged(lvcc) ?
'Y' :
'N');
2544 page[left++] =
'\n';
2555 .dev_close = lanai_dev_close,
2557 .close = lanai_close,
2563 .change_qos = lanai_change_qos,
2577 if (lanai ==
NULL) {
2579 ": couldn't allocate dev_data structure!\n");
2584 if (atmdev ==
NULL) {
2586 ": couldn't register atm device!\n");
2595 result = lanai_dev_open(atmdev);
2597 DPRINTK(
"lanai_start() failed, err=%d\n", -result);
2613 .id_table = lanai_pci_tbl,
2614 .probe = lanai_init_one,
2617 static int __init lanai_module_init(
void)
2621 x = pci_register_driver(&lanai_driver);
2627 static void __exit lanai_module_exit(
void)
2632 DPRINTK(
"cleanup_module()\n");