| /* | |
| * 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); |