1/* 2 * A filtering function. There are two filters/port. Filter "0" 3 * is the input filter, and filter "1" is the output filter. 4 */ 5typedef int (FILTER_FUNC)(uchar *pktp, int pktlen, ulong *scratch, int port); 6#define NFILTERS 2 7 8/* 9 * The per port structure 10 */ 11typedef struct 12{ 13 int chan; /* Channel number (0-3) */ 14 ulong portaddr; /* address of 596 port register */ 15 volatile ulong *ca; /* address of 596 chan attention */ 16 ulong intmask; /* Interrupt mask for this port */ 17 ulong intack; /* Ack bit for this port */ 18 19 uchar ethaddr[6]; /* Ethernet address of this port */ 20 int is_promisc; /* Port is promiscuous */ 21 22 int debug; /* Debugging turned on */ 23 24 I596_ISCP *iscpp; /* Uncached ISCP pointer */ 25 I596_SCP *scpp; /* Uncached SCP pointer */ 26 I596_SCB *scbp; /* Uncached SCB pointer */ 27 28 I596_ISCP iscp; 29 I596_SCB scb; 30 31 /* Command Queue */ 32 I596_CB *cb0; 33 I596_CB *cbN; 34 I596_CB *cb_head; 35 I596_CB *cb_tail; 36 37 /* Receive Queue */ 38 I596_RFD *rfd0; 39 I596_RFD *rfdN; 40 I596_RFD *rfd_head; 41 I596_RFD *rfd_tail; 42 43 /* Receive Buffers */ 44 I596_RBD *rbd0; 45 I596_RBD *rbdN; 46 I596_RBD *rbd_head; 47 I596_RBD *rbd_tail; 48 int buf_size; /* Size of an RBD buffer */ 49 int buf_cnt; /* Total RBD's allocated */ 50 51 /* Rx Statistics */ 52 ulong cnt_rx_cnt; /* Total packets rcvd, good and bad */ 53 ulong cnt_rx_good; /* Total good packets rcvd */ 54 ulong cnt_rx_bad; /* Total of all bad packets rcvd */ 55 /* Subtotals can be gotten from SCB */ 56 ulong cnt_rx_nores; /* No resources */ 57 ulong cnt_rx_bytes; /* Total bytes rcvd */ 58 59 /* Tx Statistics */ 60 ulong cnt_tx_queued; 61 ulong cnt_tx_done; 62 ulong cnt_tx_freed; 63 ulong cnt_tx_nores; /* No resources */ 64 65 ulong cnt_tx_bad; 66 ulong cnt_tx_err_late; 67 ulong cnt_tx_err_nocrs; 68 ulong cnt_tx_err_nocts; 69 ulong cnt_tx_err_under; 70 ulong cnt_tx_err_maxcol; 71 ulong cnt_tx_collisions; 72 73 /* Special stuff for host */ 74# define rfd_freed cnt_rx_cnt 75 ulong rbd_freed; 76 int host_timer; 77 78 /* Added after first beta */ 79 ulong cnt_tx_races; /* Counts race conditions */ 80 int spanstate; 81 ulong cnt_st_tx; /* send span tree pkts */ 82 ulong cnt_st_fail_tx; /* Failures to send span tree pkts */ 83 ulong cnt_st_fail_rbd;/* Failures to send span tree pkts */ 84 ulong cnt_st_rx; /* rcv span tree pkts */ 85 ulong cnt_st_rx_bad; /* bogus st packets rcvd */ 86 ulong cnt_rx_fwd; /* Rcvd packets that were forwarded */ 87 88 ulong cnt_rx_mcast; /* Multicast pkts received */ 89 ulong cnt_tx_mcast; /* Multicast pkts transmitted */ 90 ulong cnt_tx_bytes; /* Bytes transmitted */ 91 92 /* 93 * Packet filtering 94 * Filter 0: input filter 95 * Filter 1: output filter 96 */ 97 98 ulong *filter_space[NFILTERS]; 99 FILTER_FUNC *filter_func[NFILTERS]; 100 ulong filter_cnt[NFILTERS]; 101 ulong filter_len[NFILTERS]; 102 103 ulong pad[ (512-300) / 4]; 104} PORT; 105 106/* 107 * Port[0] is host interface 108 * Port[1..SE_NPORTS] are external 10 Base T ports. Fewer may be in 109 * use, depending on whether this is an SE-4 or 110 * an SE-6. 111 * Port[SE_NPORTS] Pseudo-port for Spanning tree and SNMP 112 */ 113extern PORT Port[1+SE_NPORTS+1]; 114 115extern int Nports; /* Number of genuine ethernet controllers */ 116extern int Nchan; /* ... plus one for host interface */ 117 118extern int FirstChan; /* 0 or 1, depedning on whether host is used */ 119extern int NumChan; /* 4 or 5 */ 120 121/* 122 * A few globals 123 */ 124extern int IsPromisc; 125extern int MultiNicMode; 126 127/* 128 * Functions 129 */ 130extern void eth_xmit_spew_on(PORT *p, int cnt); 131extern void eth_xmit_spew_off(PORT *p); 132 133extern I596_RBD *alloc_rbds(PORT *p, int num); 134 135extern I596_CB * eth_cb_alloc(PORT *p); 136