11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * Header file for sonic.c 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (C) Waldorf Electronics, Germany 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Written by Andreas Busse 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: most of the structure definitions here are endian dependent. 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If you want to use this driver on big endian machines, the data 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and pad structure members must be exchanged. Also, the structures 106aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik * need to be changed accordingly to the bus size. 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 12efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * 981229 MSch: did just that for the 68k Mac port (32 bit, big endian) 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 14efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * 990611 David Huggins-Daines <dhd@debian.org>: This machine abstraction 15efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * does not cope with 16-bit bus sizes very well. Therefore I have 16efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * rewritten it with ugly macros and evil inlines. 17efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * 18efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * 050625 Finn Thain: introduced more 32-bit cards and dhd's support 19efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * for 16-bit cards (from the mac68k project). 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef SONIC_H 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_H 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SONIC register offsets 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CMD 0x00 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR 0x01 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR 0x02 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR 0x03 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_IMR 0x04 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_ISR 0x05 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_UTDA 0x06 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CTDA 0x07 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_URDA 0x0d 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CRDA 0x0e 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_EOBC 0x13 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_URRA 0x14 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RSA 0x15 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_REA 0x16 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RRP 0x17 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RWP 0x18 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RSC 0x2b 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CEP 0x21 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CAP2 0x22 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CAP1 0x23 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CAP0 0x24 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CE 0x25 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CDP 0x26 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CDC 0x27 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_WT0 0x29 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_WT1 0x2a 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_SR 0x28 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* test-only registers */ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TPS 0x08 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TFC 0x09 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TSA0 0x0a 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TSA1 0x0b 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TFS 0x0c 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CRBA0 0x0f 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CRBA1 0x10 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RBWC0 0x11 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RBWC1 0x12 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TTDA 0x20 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_MDT 0x2f 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TRBA0 0x19 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TRBA1 0x1a 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TBWC0 0x1b 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TBWC1 0x1c 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_LLFA 0x1f 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_ADDR0 0x1d 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_ADDR1 0x1e 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Error counters 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 91efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CRCT 0x2c 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_FAET 0x2d 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_MPT 0x2e 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR2 0x3f 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SONIC command bits 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_LCAM 0x0200 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_RRRA 0x0100 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_RST 0x0080 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_ST 0x0020 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_STP 0x0010 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_RXEN 0x0008 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_RXDIS 0x0004 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_TXP 0x0002 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_CR_HTX 0x0001 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SONIC data configuration bits 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_EXBUS 0x8000 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_LBR 0x2000 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_PO1 0x1000 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_PO0 0x0800 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_SBUS 0x0400 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_USR1 0x0200 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_USR0 0x0100 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_WC1 0x0080 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_WC0 0x0040 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_DW 0x0020 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_BMS 0x0010 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_RFT1 0x0008 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_RFT0 0x0004 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_TFT1 0x0002 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_DCR_TFT0 0x0001 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Constants for the SONIC receive control register. 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_ERR 0x8000 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_RNT 0x4000 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_BRD 0x2000 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_PRO 0x1000 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_AMC 0x0800 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LB1 0x0400 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LB0 0x0200 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_MC 0x0100 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_BC 0x0080 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LPKT 0x0040 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_CRS 0x0020 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_COL 0x0010 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_CRCR 0x0008 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_FAER 0x0004 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LBK 0x0002 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_PRX 0x0001 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LB_OFF 0 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LB_MAC SONIC_RCR_LB0 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LB_ENDEC SONIC_RCR_LB1 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_LB_TRANS (SONIC_RCR_LB0 | SONIC_RCR_LB1) 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* default RCR setup */ 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_RCR_DEFAULT (SONIC_RCR_BRD) 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SONIC Transmit Control register bits 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_PINTR 0x8000 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_POWC 0x4000 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_CRCI 0x2000 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_EXDIS 0x1000 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_EXD 0x0400 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_DEF 0x0200 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_NCRS 0x0100 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_CRLS 0x0080 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_EXC 0x0040 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_PMB 0x0008 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_FU 0x0004 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_BCM 0x0002 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_PTX 0x0001 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_TCR_DEFAULT 0x0000 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1846aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik/* 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Constants for the SONIC_INTERRUPT_MASK and 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SONIC_INTERRUPT_STATUS registers. 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_BR 0x4000 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_HBL 0x2000 191efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_LCD 0x1000 192efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_PINT 0x0800 193efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_PKTRX 0x0400 194efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_TXDN 0x0200 195efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_TXER 0x0100 196efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_TC 0x0080 197efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_RDE 0x0040 198efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_INT_RBE 0x0020 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_RBAE 0x0010 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_CRC 0x0008 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_FAE 0x0004 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_MP 0x0002 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SONIC_INT_RFO 0x0001 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The interrupts we allow. 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 210efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_IMR_DEFAULT ( SONIC_INT_BR | \ 211efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain SONIC_INT_LCD | \ 212efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain SONIC_INT_RFO | \ 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_PKTRX | \ 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_TXDN | \ 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_TXER | \ 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_RDE | \ 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_RBAE | \ 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_CRC | \ 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_FAE | \ 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SONIC_INT_MP) 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 223efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_EOL 0x0001 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CAM_DESCRIPTORS 16 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 226efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain/* Offsets in the various DMA buffers accessed by the SONIC */ 227efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 228efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_BITMODE16 0 229efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_BITMODE32 1 230efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_BUS_SCALE(bitmode) ((bitmode) ? 4 : 2) 231efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain/* Note! These are all measured in bus-size units, so use SONIC_BUS_SCALE */ 232efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SIZEOF_SONIC_RR 4 233efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RR_BUFADR_L 0 234efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RR_BUFADR_H 1 235efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RR_BUFSIZE_L 2 236efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RR_BUFSIZE_H 3 237efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 238efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SIZEOF_SONIC_RD 7 239efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_STATUS 0 240efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_PKTLEN 1 241efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_PKTPTR_L 2 242efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_PKTPTR_H 3 243efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_SEQNO 4 244efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_LINK 5 245efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RD_IN_USE 6 246efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 247efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SIZEOF_SONIC_TD 8 248efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_STATUS 0 249efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_CONFIG 1 250efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_PKTSIZE 2 251efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_FRAG_COUNT 3 252efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_FRAG_PTR_L 4 253efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_FRAG_PTR_H 5 254efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_FRAG_SIZE 6 255efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TD_LINK 7 256efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 257efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SIZEOF_SONIC_CD 4 258efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_CD_ENTRY_POINTER 0 259efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_CD_CAP0 1 260efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_CD_CAP1 2 261efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_CD_CAP2 3 262efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 263efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SIZEOF_SONIC_CDA ((CAM_DESCRIPTORS * SIZEOF_SONIC_CD) + 1) 264efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_CDA_CAM_ENABLE (CAM_DESCRIPTORS * SIZEOF_SONIC_CD) 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Some tunables for the buffer areas. Power of 2 is required 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the current driver uses one receive buffer for each descriptor. 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MSch: use more buffer space for the slow m68k Macs! 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 272efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_NUM_RRS 16 /* number of receive resources */ 273efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */ 274efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_NUM_TDS 16 /* number of transmit descriptors */ 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 276efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) 277efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 279efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SONIC_RBSIZE 1520 /* size of one resource buffer */ 280efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 281efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain/* Again, measured in bus size units! */ 282efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define SIZEOF_SONIC_DESC (SIZEOF_SONIC_CDA \ 283efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain + (SIZEOF_SONIC_TD * SONIC_NUM_TDS) \ 284efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain + (SIZEOF_SONIC_RD * SONIC_NUM_RDS) \ 285efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain + (SIZEOF_SONIC_RR * SONIC_NUM_RRS)) 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Information that need to be kept for each board. */ 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct sonic_local { 289efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain /* Bus size. 0 == 16 bits, 1 == 32 bits. */ 290efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int dma_bitmode; 291efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain /* Register offset within the longword (independent of endianness, 292efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain and varies from one type of Macintosh SONIC to another 293efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (Aarrgh)) */ 294efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int reg_offset; 295efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain void *descriptors; 296efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain /* Crud. These areas have to be within the same 64K. Therefore 297efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain we allocate a desriptors page, and point these to places within it. */ 298efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain void *cda; /* CAM descriptor area */ 299efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain void *tda; /* Transmit descriptor area */ 300efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain void *rra; /* Receive resource area */ 301efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain void *rda; /* Receive descriptor area */ 302efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain struct sk_buff* volatile rx_skb[SONIC_NUM_RRS]; /* packets to be received */ 303efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain struct sk_buff* volatile tx_skb[SONIC_NUM_TDS]; /* packets to be transmitted */ 304efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int tx_len[SONIC_NUM_TDS]; /* lengths of tx DMA mappings */ 305efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain /* Logical DMA addresses on MIPS, bus addresses on m68k 306efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain * (so "laddr" is a bit misleading) */ 307efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain dma_addr_t descriptors_laddr; 308efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain u32 cda_laddr; /* logical DMA address of CDA */ 309efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain u32 tda_laddr; /* logical DMA address of TDA */ 310efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain u32 rra_laddr; /* logical DMA address of RRA */ 311efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain u32 rda_laddr; /* logical DMA address of RDA */ 312efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain dma_addr_t rx_laddr[SONIC_NUM_RRS]; /* logical DMA addresses of rx skbuffs */ 313efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain dma_addr_t tx_laddr[SONIC_NUM_TDS]; /* logical DMA addresses of tx skbuffs */ 314efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int rra_end; 315efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int cur_rwp; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int cur_rx; 317efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int cur_tx; /* first unacked transmit packet */ 318efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int eol_rx; 319efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int eol_tx; /* last unacked transmit packet */ 320efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain unsigned int next_tx; /* next free TD */ 321efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain struct device *device; /* generic device */ 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct net_device_stats stats; 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 325efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#define TX_TIMEOUT (3 * HZ) 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Index to functions, as function prototypes. */ 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sonic_open(struct net_device *dev); 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sonic_send_packet(struct sk_buff *skb, struct net_device *dev); 3317d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellsstatic irqreturn_t sonic_interrupt(int irq, void *dev_id); 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sonic_rx(struct net_device *dev); 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sonic_close(struct net_device *dev); 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct net_device_stats *sonic_get_stats(struct net_device *dev); 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sonic_multicast_list(struct net_device *dev); 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sonic_init(struct net_device *dev); 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sonic_tx_timeout(struct net_device *dev); 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 339efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain/* Internal inlines for reading/writing DMA buffers. Note that bus 340efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain size and endianness matter here, whereas they don't for registers, 341efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain as far as we can tell. */ 342efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain/* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() 343efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain is a much better name. */ 344efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline void sonic_buf_put(void* base, int bitmode, 345efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset, __u16 val) 346efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 347efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain if (bitmode) 348efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#ifdef __BIG_ENDIAN 349efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain ((__u16 *) base + (offset*2))[1] = val; 350efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#else 351efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain ((__u16 *) base + (offset*2))[0] = val; 352efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#endif 353efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain else 354efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain ((__u16 *) base)[offset] = val; 355efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 356efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 357efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline __u16 sonic_buf_get(void* base, int bitmode, 358efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset) 359efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 360efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain if (bitmode) 361efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#ifdef __BIG_ENDIAN 362efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return ((volatile __u16 *) base + (offset*2))[1]; 363efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#else 364efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return ((volatile __u16 *) base + (offset*2))[0]; 365efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain#endif 366efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain else 367efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return ((volatile __u16 *) base)[offset]; 368efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 369efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 370efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain/* Inlines that you should actually use for reading/writing DMA buffers */ 371efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline void sonic_cda_put(struct net_device* dev, int entry, 372efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset, __u16 val) 373efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 3748f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 375efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain sonic_buf_put(lp->cda, lp->dma_bitmode, 376efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_CD) + offset, val); 377efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 378efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 379efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline __u16 sonic_cda_get(struct net_device* dev, int entry, 380efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset) 381efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 3828f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 383efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return sonic_buf_get(lp->cda, lp->dma_bitmode, 384efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_CD) + offset); 385efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 386efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 387efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline void sonic_set_cam_enable(struct net_device* dev, __u16 val) 388efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 3898f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 390efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain sonic_buf_put(lp->cda, lp->dma_bitmode, SONIC_CDA_CAM_ENABLE, val); 391efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 392efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 393efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline __u16 sonic_get_cam_enable(struct net_device* dev) 394efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 3958f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 396efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return sonic_buf_get(lp->cda, lp->dma_bitmode, SONIC_CDA_CAM_ENABLE); 397efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 398efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 399efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline void sonic_tda_put(struct net_device* dev, int entry, 400efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset, __u16 val) 401efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 4028f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 403efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain sonic_buf_put(lp->tda, lp->dma_bitmode, 404efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_TD) + offset, val); 405efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 406efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 407efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline __u16 sonic_tda_get(struct net_device* dev, int entry, 408efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset) 409efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 4108f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 411efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return sonic_buf_get(lp->tda, lp->dma_bitmode, 412efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_TD) + offset); 413efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 414efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 415efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline void sonic_rda_put(struct net_device* dev, int entry, 416efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset, __u16 val) 417efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 4188f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 419efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain sonic_buf_put(lp->rda, lp->dma_bitmode, 420efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_RD) + offset, val); 421efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 422efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 423efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline __u16 sonic_rda_get(struct net_device* dev, int entry, 424efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset) 425efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 4268f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 427efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return sonic_buf_get(lp->rda, lp->dma_bitmode, 428efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_RD) + offset); 429efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 430efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 431efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline void sonic_rra_put(struct net_device* dev, int entry, 432efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset, __u16 val) 433efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 4348f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 435efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain sonic_buf_put(lp->rra, lp->dma_bitmode, 436efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_RR) + offset, val); 437efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 438efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 439efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thainstatic inline __u16 sonic_rra_get(struct net_device* dev, int entry, 440efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain int offset) 441efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain{ 4428f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct sonic_local *lp = netdev_priv(dev); 443efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain return sonic_buf_get(lp->rra, lp->dma_bitmode, 444efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain (entry * SIZEOF_SONIC_RR) + offset); 445efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain} 446efcce839360fb3a7b6dedeacaec80f68b0f2d052Finn Thain 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *version = 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "sonic.c:v0.92 20.9.98 tsbogend@alpha.franken.de\n"; 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* SONIC_H */ 451