sonic.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. /*
  2. * Helpfile for sonic.c
  3. *
  4. * (C) Waldorf Electronics, Germany
  5. * Written by Andreas Busse
  6. *
  7. * NOTE: most of the structure definitions here are endian dependent.
  8. * If you want to use this driver on big endian machines, the data
  9. * and pad structure members must be exchanged. Also, the structures
  10. * need to be changed accordingly to the bus size.
  11. *
  12. * 981229 MSch: did just that for the 68k Mac port (32 bit, big endian),
  13. * see CONFIG_MACSONIC branch below.
  14. *
  15. */
  16. #ifndef SONIC_H
  17. #define SONIC_H
  18. #include <linux/config.h>
  19. /*
  20. * SONIC register offsets
  21. */
  22. #define SONIC_CMD 0x00
  23. #define SONIC_DCR 0x01
  24. #define SONIC_RCR 0x02
  25. #define SONIC_TCR 0x03
  26. #define SONIC_IMR 0x04
  27. #define SONIC_ISR 0x05
  28. #define SONIC_UTDA 0x06
  29. #define SONIC_CTDA 0x07
  30. #define SONIC_URDA 0x0d
  31. #define SONIC_CRDA 0x0e
  32. #define SONIC_EOBC 0x13
  33. #define SONIC_URRA 0x14
  34. #define SONIC_RSA 0x15
  35. #define SONIC_REA 0x16
  36. #define SONIC_RRP 0x17
  37. #define SONIC_RWP 0x18
  38. #define SONIC_RSC 0x2b
  39. #define SONIC_CEP 0x21
  40. #define SONIC_CAP2 0x22
  41. #define SONIC_CAP1 0x23
  42. #define SONIC_CAP0 0x24
  43. #define SONIC_CE 0x25
  44. #define SONIC_CDP 0x26
  45. #define SONIC_CDC 0x27
  46. #define SONIC_WT0 0x29
  47. #define SONIC_WT1 0x2a
  48. #define SONIC_SR 0x28
  49. /* test-only registers */
  50. #define SONIC_TPS 0x08
  51. #define SONIC_TFC 0x09
  52. #define SONIC_TSA0 0x0a
  53. #define SONIC_TSA1 0x0b
  54. #define SONIC_TFS 0x0c
  55. #define SONIC_CRBA0 0x0f
  56. #define SONIC_CRBA1 0x10
  57. #define SONIC_RBWC0 0x11
  58. #define SONIC_RBWC1 0x12
  59. #define SONIC_TTDA 0x20
  60. #define SONIC_MDT 0x2f
  61. #define SONIC_TRBA0 0x19
  62. #define SONIC_TRBA1 0x1a
  63. #define SONIC_TBWC0 0x1b
  64. #define SONIC_TBWC1 0x1c
  65. #define SONIC_LLFA 0x1f
  66. #define SONIC_ADDR0 0x1d
  67. #define SONIC_ADDR1 0x1e
  68. /*
  69. * Error counters
  70. */
  71. #define SONIC_CRCT 0x2c
  72. #define SONIC_FAET 0x2d
  73. #define SONIC_MPT 0x2e
  74. #define SONIC_DCR2 0x3f
  75. /*
  76. * SONIC command bits
  77. */
  78. #define SONIC_CR_LCAM 0x0200
  79. #define SONIC_CR_RRRA 0x0100
  80. #define SONIC_CR_RST 0x0080
  81. #define SONIC_CR_ST 0x0020
  82. #define SONIC_CR_STP 0x0010
  83. #define SONIC_CR_RXEN 0x0008
  84. #define SONIC_CR_RXDIS 0x0004
  85. #define SONIC_CR_TXP 0x0002
  86. #define SONIC_CR_HTX 0x0001
  87. /*
  88. * SONIC data configuration bits
  89. */
  90. #define SONIC_DCR_EXBUS 0x8000
  91. #define SONIC_DCR_LBR 0x2000
  92. #define SONIC_DCR_PO1 0x1000
  93. #define SONIC_DCR_PO0 0x0800
  94. #define SONIC_DCR_SBUS 0x0400
  95. #define SONIC_DCR_USR1 0x0200
  96. #define SONIC_DCR_USR0 0x0100
  97. #define SONIC_DCR_WC1 0x0080
  98. #define SONIC_DCR_WC0 0x0040
  99. #define SONIC_DCR_DW 0x0020
  100. #define SONIC_DCR_BMS 0x0010
  101. #define SONIC_DCR_RFT1 0x0008
  102. #define SONIC_DCR_RFT0 0x0004
  103. #define SONIC_DCR_TFT1 0x0002
  104. #define SONIC_DCR_TFT0 0x0001
  105. /*
  106. * Constants for the SONIC receive control register.
  107. */
  108. #define SONIC_RCR_ERR 0x8000
  109. #define SONIC_RCR_RNT 0x4000
  110. #define SONIC_RCR_BRD 0x2000
  111. #define SONIC_RCR_PRO 0x1000
  112. #define SONIC_RCR_AMC 0x0800
  113. #define SONIC_RCR_LB1 0x0400
  114. #define SONIC_RCR_LB0 0x0200
  115. #define SONIC_RCR_MC 0x0100
  116. #define SONIC_RCR_BC 0x0080
  117. #define SONIC_RCR_LPKT 0x0040
  118. #define SONIC_RCR_CRS 0x0020
  119. #define SONIC_RCR_COL 0x0010
  120. #define SONIC_RCR_CRCR 0x0008
  121. #define SONIC_RCR_FAER 0x0004
  122. #define SONIC_RCR_LBK 0x0002
  123. #define SONIC_RCR_PRX 0x0001
  124. #define SONIC_RCR_LB_OFF 0
  125. #define SONIC_RCR_LB_MAC SONIC_RCR_LB0
  126. #define SONIC_RCR_LB_ENDEC SONIC_RCR_LB1
  127. #define SONIC_RCR_LB_TRANS (SONIC_RCR_LB0 | SONIC_RCR_LB1)
  128. /* default RCR setup */
  129. #define SONIC_RCR_DEFAULT (SONIC_RCR_BRD)
  130. /*
  131. * SONIC Transmit Control register bits
  132. */
  133. #define SONIC_TCR_PINTR 0x8000
  134. #define SONIC_TCR_POWC 0x4000
  135. #define SONIC_TCR_CRCI 0x2000
  136. #define SONIC_TCR_EXDIS 0x1000
  137. #define SONIC_TCR_EXD 0x0400
  138. #define SONIC_TCR_DEF 0x0200
  139. #define SONIC_TCR_NCRS 0x0100
  140. #define SONIC_TCR_CRLS 0x0080
  141. #define SONIC_TCR_EXC 0x0040
  142. #define SONIC_TCR_PMB 0x0008
  143. #define SONIC_TCR_FU 0x0004
  144. #define SONIC_TCR_BCM 0x0002
  145. #define SONIC_TCR_PTX 0x0001
  146. #define SONIC_TCR_DEFAULT 0x0000
  147. /*
  148. * Constants for the SONIC_INTERRUPT_MASK and
  149. * SONIC_INTERRUPT_STATUS registers.
  150. */
  151. #define SONIC_INT_BR 0x4000
  152. #define SONIC_INT_HBL 0x2000
  153. #define SONIC_INT_LCD 0x1000
  154. #define SONIC_INT_PINT 0x0800
  155. #define SONIC_INT_PKTRX 0x0400
  156. #define SONIC_INT_TXDN 0x0200
  157. #define SONIC_INT_TXER 0x0100
  158. #define SONIC_INT_TC 0x0080
  159. #define SONIC_INT_RDE 0x0040
  160. #define SONIC_INT_RBE 0x0020
  161. #define SONIC_INT_RBAE 0x0010
  162. #define SONIC_INT_CRC 0x0008
  163. #define SONIC_INT_FAE 0x0004
  164. #define SONIC_INT_MP 0x0002
  165. #define SONIC_INT_RFO 0x0001
  166. /*
  167. * The interrupts we allow.
  168. */
  169. #define SONIC_IMR_DEFAULT (SONIC_INT_BR | \
  170. SONIC_INT_LCD | \
  171. SONIC_INT_PINT | \
  172. SONIC_INT_PKTRX | \
  173. SONIC_INT_TXDN | \
  174. SONIC_INT_TXER | \
  175. SONIC_INT_RDE | \
  176. SONIC_INT_RBE | \
  177. SONIC_INT_RBAE | \
  178. SONIC_INT_CRC | \
  179. SONIC_INT_FAE | \
  180. SONIC_INT_MP)
  181. #define SONIC_END_OF_LINKS 0x0001
  182. #ifdef CONFIG_MACSONIC
  183. /*
  184. * Big endian like structures on 680x0 Macs
  185. */
  186. typedef struct {
  187. u32 rx_bufadr_l; /* receive buffer ptr */
  188. u32 rx_bufadr_h;
  189. u32 rx_bufsize_l; /* no. of words in the receive buffer */
  190. u32 rx_bufsize_h;
  191. } sonic_rr_t;
  192. /*
  193. * Sonic receive descriptor. Receive descriptors are
  194. * kept in a linked list of these structures.
  195. */
  196. typedef struct {
  197. SREGS_PAD(pad0);
  198. u16 rx_status; /* status after reception of a packet */
  199. SREGS_PAD(pad1);
  200. u16 rx_pktlen; /* length of the packet incl. CRC */
  201. /*
  202. * Pointers to the location in the receive buffer area (RBA)
  203. * where the packet resides. A packet is always received into
  204. * a contiguous piece of memory.
  205. */
  206. SREGS_PAD(pad2);
  207. u16 rx_pktptr_l;
  208. SREGS_PAD(pad3);
  209. u16 rx_pktptr_h;
  210. SREGS_PAD(pad4);
  211. u16 rx_seqno; /* sequence no. */
  212. SREGS_PAD(pad5);
  213. u16 link; /* link to next RDD (end if EOL bit set) */
  214. /*
  215. * Owner of this descriptor, 0= driver, 1=sonic
  216. */
  217. SREGS_PAD(pad6);
  218. u16 in_use;
  219. caddr_t rda_next; /* pointer to next RD */
  220. } sonic_rd_t;
  221. /*
  222. * Describes a Transmit Descriptor
  223. */
  224. typedef struct {
  225. SREGS_PAD(pad0);
  226. u16 tx_status; /* status after transmission of a packet */
  227. SREGS_PAD(pad1);
  228. u16 tx_config; /* transmit configuration for this packet */
  229. SREGS_PAD(pad2);
  230. u16 tx_pktsize; /* size of the packet to be transmitted */
  231. SREGS_PAD(pad3);
  232. u16 tx_frag_count; /* no. of fragments */
  233. SREGS_PAD(pad4);
  234. u16 tx_frag_ptr_l;
  235. SREGS_PAD(pad5);
  236. u16 tx_frag_ptr_h;
  237. SREGS_PAD(pad6);
  238. u16 tx_frag_size;
  239. SREGS_PAD(pad7);
  240. u16 link; /* ptr to next descriptor */
  241. } sonic_td_t;
  242. /*
  243. * Describes an entry in the CAM Descriptor Area.
  244. */
  245. typedef struct {
  246. SREGS_PAD(pad0);
  247. u16 cam_entry_pointer;
  248. SREGS_PAD(pad1);
  249. u16 cam_cap0;
  250. SREGS_PAD(pad2);
  251. u16 cam_cap1;
  252. SREGS_PAD(pad3);
  253. u16 cam_cap2;
  254. } sonic_cd_t;
  255. #define CAM_DESCRIPTORS 16
  256. typedef struct {
  257. sonic_cd_t cam_desc[CAM_DESCRIPTORS];
  258. SREGS_PAD(pad);
  259. u16 cam_enable;
  260. } sonic_cda_t;
  261. #else /* original declarations, little endian 32 bit */
  262. /*
  263. * structure definitions
  264. */
  265. typedef struct {
  266. u32 rx_bufadr_l; /* receive buffer ptr */
  267. u32 rx_bufadr_h;
  268. u32 rx_bufsize_l; /* no. of words in the receive buffer */
  269. u32 rx_bufsize_h;
  270. } sonic_rr_t;
  271. /*
  272. * Sonic receive descriptor. Receive descriptors are
  273. * kept in a linked list of these structures.
  274. */
  275. typedef struct {
  276. u16 rx_status; /* status after reception of a packet */
  277. SREGS_PAD(pad0);
  278. u16 rx_pktlen; /* length of the packet incl. CRC */
  279. SREGS_PAD(pad1);
  280. /*
  281. * Pointers to the location in the receive buffer area (RBA)
  282. * where the packet resides. A packet is always received into
  283. * a contiguous piece of memory.
  284. */
  285. u16 rx_pktptr_l;
  286. SREGS_PAD(pad2);
  287. u16 rx_pktptr_h;
  288. SREGS_PAD(pad3);
  289. u16 rx_seqno; /* sequence no. */
  290. SREGS_PAD(pad4);
  291. u16 link; /* link to next RDD (end if EOL bit set) */
  292. SREGS_PAD(pad5);
  293. /*
  294. * Owner of this descriptor, 0= driver, 1=sonic
  295. */
  296. u16 in_use;
  297. SREGS_PAD(pad6);
  298. caddr_t rda_next; /* pointer to next RD */
  299. } sonic_rd_t;
  300. /*
  301. * Describes a Transmit Descriptor
  302. */
  303. typedef struct {
  304. u16 tx_status; /* status after transmission of a packet */
  305. SREGS_PAD(pad0);
  306. u16 tx_config; /* transmit configuration for this packet */
  307. SREGS_PAD(pad1);
  308. u16 tx_pktsize; /* size of the packet to be transmitted */
  309. SREGS_PAD(pad2);
  310. u16 tx_frag_count; /* no. of fragments */
  311. SREGS_PAD(pad3);
  312. u16 tx_frag_ptr_l;
  313. SREGS_PAD(pad4);
  314. u16 tx_frag_ptr_h;
  315. SREGS_PAD(pad5);
  316. u16 tx_frag_size;
  317. SREGS_PAD(pad6);
  318. u16 link; /* ptr to next descriptor */
  319. SREGS_PAD(pad7);
  320. } sonic_td_t;
  321. /*
  322. * Describes an entry in the CAM Descriptor Area.
  323. */
  324. typedef struct {
  325. u16 cam_entry_pointer;
  326. SREGS_PAD(pad0);
  327. u16 cam_cap0;
  328. SREGS_PAD(pad1);
  329. u16 cam_cap1;
  330. SREGS_PAD(pad2);
  331. u16 cam_cap2;
  332. SREGS_PAD(pad3);
  333. } sonic_cd_t;
  334. #define CAM_DESCRIPTORS 16
  335. typedef struct {
  336. sonic_cd_t cam_desc[CAM_DESCRIPTORS];
  337. u16 cam_enable;
  338. SREGS_PAD(pad);
  339. } sonic_cda_t;
  340. #endif /* endianness */
  341. /*
  342. * Some tunables for the buffer areas. Power of 2 is required
  343. * the current driver uses one receive buffer for each descriptor.
  344. *
  345. * MSch: use more buffer space for the slow m68k Macs!
  346. */
  347. #ifdef CONFIG_MACSONIC
  348. #define SONIC_NUM_RRS 32 /* number of receive resources */
  349. #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */
  350. #define SONIC_NUM_TDS 32 /* number of transmit descriptors */
  351. #else
  352. #define SONIC_NUM_RRS 16 /* number of receive resources */
  353. #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */
  354. #define SONIC_NUM_TDS 16 /* number of transmit descriptors */
  355. #endif
  356. #define SONIC_RBSIZE 1520 /* size of one resource buffer */
  357. #define SONIC_RDS_MASK (SONIC_NUM_RDS-1)
  358. #define SONIC_TDS_MASK (SONIC_NUM_TDS-1)
  359. /* Information that need to be kept for each board. */
  360. struct sonic_local {
  361. sonic_cda_t cda; /* virtual CPU address of CDA */
  362. sonic_td_t tda[SONIC_NUM_TDS]; /* transmit descriptor area */
  363. sonic_rr_t rra[SONIC_NUM_RRS]; /* receive resource area */
  364. sonic_rd_t rda[SONIC_NUM_RDS]; /* receive descriptor area */
  365. struct sk_buff *tx_skb[SONIC_NUM_TDS]; /* skbuffs for packets to transmit */
  366. unsigned int tx_laddr[SONIC_NUM_TDS]; /* logical DMA address fro skbuffs */
  367. unsigned char *rba; /* start of receive buffer areas */
  368. unsigned int cda_laddr; /* logical DMA address of CDA */
  369. unsigned int tda_laddr; /* logical DMA address of TDA */
  370. unsigned int rra_laddr; /* logical DMA address of RRA */
  371. unsigned int rda_laddr; /* logical DMA address of RDA */
  372. unsigned int rba_laddr; /* logical DMA address of RBA */
  373. unsigned int cur_rra; /* current indexes to resource areas */
  374. unsigned int cur_rx;
  375. unsigned int cur_tx;
  376. unsigned int dirty_tx; /* last unacked transmit packet */
  377. char tx_full;
  378. struct net_device_stats stats;
  379. };
  380. #define TX_TIMEOUT 6
  381. /* Index to functions, as function prototypes. */
  382. static int sonic_open(struct net_device *dev);
  383. static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev);
  384. static irqreturn_t sonic_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  385. static void sonic_rx(struct net_device *dev);
  386. static int sonic_close(struct net_device *dev);
  387. static struct net_device_stats *sonic_get_stats(struct net_device *dev);
  388. static void sonic_multicast_list(struct net_device *dev);
  389. static int sonic_init(struct net_device *dev);
  390. static void sonic_tx_timeout(struct net_device *dev);
  391. static const char *version =
  392. "sonic.c:v0.92 20.9.98 tsbogend@alpha.franken.de\n";
  393. #endif /* SONIC_H */