/* * A filtering function. There are two filters/port. Filter "0" * is the input filter, and filter "1" is the output filter. */ typedef int (FILTER_FUNC)(uchar *pktp, int pktlen, ulong *scratch, int port); #define NFILTERS 2 /* * The per port structure */ typedef struct { int chan; /* Channel number (0-3) */ ulong portaddr; /* address of 596 port register */ volatile ulong *ca; /* address of 596 chan attention */ ulong intmask; /* Interrupt mask for this port */ ulong intack; /* Ack bit for this port */ uchar ethaddr[6]; /* Ethernet address of this port */ int is_promisc; /* Port is promiscuous */ int debug; /* Debugging turned on */ I596_ISCP *iscpp; /* Uncached ISCP pointer */ I596_SCP *scpp; /* Uncached SCP pointer */ I596_SCB *scbp; /* Uncached SCB pointer */ I596_ISCP iscp; I596_SCB scb; /* Command Queue */ I596_CB *cb0; I596_CB *cbN; I596_CB *cb_head; I596_CB *cb_tail; /* Receive Queue */ I596_RFD *rfd0; I596_RFD *rfdN; I596_RFD *rfd_head; I596_RFD *rfd_tail; /* Receive Buffers */ I596_RBD *rbd0; I596_RBD *rbdN; I596_RBD *rbd_head; I596_RBD *rbd_tail; int buf_size; /* Size of an RBD buffer */ int buf_cnt; /* Total RBD's allocated */ /* Rx Statistics */ ulong cnt_rx_cnt; /* Total packets rcvd, good and bad */ ulong cnt_rx_good; /* Total good packets rcvd */ ulong cnt_rx_bad; /* Total of all bad packets rcvd */ /* Subtotals can be gotten from SCB */ ulong cnt_rx_nores; /* No resources */ ulong cnt_rx_bytes; /* Total bytes rcvd */ /* Tx Statistics */ ulong cnt_tx_queued; ulong cnt_tx_done; ulong cnt_tx_freed; ulong cnt_tx_nores; /* No resources */ ulong cnt_tx_bad; ulong cnt_tx_err_late; ulong cnt_tx_err_nocrs; ulong cnt_tx_err_nocts; ulong cnt_tx_err_under; ulong cnt_tx_err_maxcol; ulong cnt_tx_collisions; /* Special stuff for host */ # define rfd_freed cnt_rx_cnt ulong rbd_freed; int host_timer; /* Added after first beta */ ulong cnt_tx_races; /* Counts race conditions */ int spanstate; ulong cnt_st_tx; /* send span tree pkts */ ulong cnt_st_fail_tx; /* Failures to send span tree pkts */ ulong cnt_st_fail_rbd;/* Failures to send span tree pkts */ ulong cnt_st_rx; /* rcv span tree pkts */ ulong cnt_st_rx_bad; /* bogus st packets rcvd */ ulong cnt_rx_fwd; /* Rcvd packets that were forwarded */ ulong cnt_rx_mcast; /* Multicast pkts received */ ulong cnt_tx_mcast; /* Multicast pkts transmitted */ ulong cnt_tx_bytes; /* Bytes transmitted */ /* * Packet filtering * Filter 0: input filter * Filter 1: output filter */ ulong *filter_space[NFILTERS]; FILTER_FUNC *filter_func[NFILTERS]; ulong filter_cnt[NFILTERS]; ulong filter_len[NFILTERS]; ulong pad[ (512-300) / 4]; } PORT; /* * Port[0] is host interface * Port[1..SE_NPORTS] are external 10 Base T ports. Fewer may be in * use, depending on whether this is an SE-4 or * an SE-6. * Port[SE_NPORTS] Pseudo-port for Spanning tree and SNMP */ extern PORT Port[1+SE_NPORTS+1]; extern int Nports; /* Number of genuine ethernet controllers */ extern int Nchan; /* ... plus one for host interface */ extern int FirstChan; /* 0 or 1, depedning on whether host is used */ extern int NumChan; /* 4 or 5 */ /* * A few globals */ extern int IsPromisc; extern int MultiNicMode; /* * Functions */ extern void eth_xmit_spew_on(PORT *p, int cnt); extern void eth_xmit_spew_off(PORT *p); extern I596_RBD *alloc_rbds(PORT *p, int num); extern I596_CB * eth_cb_alloc(PORT *p);