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