sonic.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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 void 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.den";
  393. #endif /* SONIC_H */