ether8390.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Ctlr for the boards using the National Semiconductor DP8390
  3. * and SMC 83C90 Network Interface Controller.
  4. * Common code is in ether8390.c.
  5. */
  6. typedef struct {
  7. Lock;
  8. ulong port; /* I/O address of 8390 */
  9. ulong data; /* I/O data port if no shared memory */
  10. uchar width; /* data transfer width in bytes */
  11. uchar ram; /* true if card has shared memory */
  12. uchar dummyrr; /* do dummy remote read */
  13. uchar nxtpkt; /* receive: software bndry */
  14. uchar pstart;
  15. uchar pstop;
  16. int txbusy; /* transmit */
  17. uchar tstart; /* 8390 ring addresses */
  18. uchar mar[8]; /* shadow multicast address registers */
  19. int mref[64]; /* reference counts for multicast groups */
  20. } Dp8390;
  21. #define Dp8390BufSz 256
  22. extern int dp8390reset(Ether*);
  23. extern void *dp8390read(Dp8390*, void*, ulong, ulong);
  24. extern void dp8390getea(Ether*, uchar*);
  25. extern void dp8390setea(Ether*);
  26. /*
  27. * x86-specific code.
  28. */
  29. #define regr(c, r) inb((c)->port+(r))
  30. #define regw(c, r, v) outb((c)->port+(r), (v))
  31. static void
  32. rdread(Dp8390* ctlr, void* to, int len)
  33. {
  34. switch(ctlr->width){
  35. default:
  36. panic("dp8390 rdread: width %d\n", ctlr->width);
  37. break;
  38. case 2:
  39. inss(ctlr->data, to, len/2);
  40. break;
  41. case 1:
  42. insb(ctlr->data, to, len);
  43. break;
  44. }
  45. }
  46. static void
  47. rdwrite(Dp8390* ctlr, void* from, int len)
  48. {
  49. switch(ctlr->width){
  50. default:
  51. panic("dp8390 rdwrite: width %d\n", ctlr->width);
  52. break;
  53. case 2:
  54. outss(ctlr->data, from, len/2);
  55. break;
  56. case 1:
  57. outsb(ctlr->data, from, len);
  58. break;
  59. }
  60. }