int NetdrvStart(END_DEVICE * pDrvCtrl) { #ifdef POLLING_MODE unsigned int unit; if (started == 1) { return OK; } #endif /** start RX Tasks */ PRINTF_DEBUG(("BCM NetDriver is starting .......\n")); #ifdef POLLING_MODE if (_n_devices > MAX_DEVICES) { printf("\r\nCannot support switch chips over 4\r\n"); return ERROR; } #endif /* POLLING_MODE */ __netDriver = pDrvCtrl; if (GetMacFromFlash(pDrvCtrl->enetAddr) == ERROR) { printf("Error: unable to start netdrv (Invalid MAC Address)\n"); return ERROR; } bcopy ((char *)pDrvCtrl->enetAddr, (char *)END_HADDR(&pDrvCtrl->end), END_HADDR_LEN(&pDrvCtrl->end)); { extern void bcmSystemInit(); bcmSystemInit(); taskDelay(100); } END_FLAGS_SET (&pDrvCtrl->end, IFF_UP | IFF_RUNNING); #ifdef POLLING_MODE gPollRecvTaskId = taskSpawn("RxPollTask", 100, 0, 16384, (FUNCPTR)DrvPollRcvPktTask, (int)pDrvCtrl, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (gPollRecvTaskId == ERROR) { return ERROR; } started = 1; #endif /* POLLING_MODE */ return (OK); }
LOCAL int NetdrvIoctl(END_DEVICE * pDrvCtrl, /* device receiving command */ int cmd, /* ioctl command code */ caddr_t data /* command argument */) { int error = 0; long value; switch (cmd) { case EIOCSADDR: if (data == NULL) { return (EINVAL); } bcopy ((char *)data, (char *)END_HADDR(&pDrvCtrl->end), END_HADDR_LEN(&pDrvCtrl->end)); break; case EIOCGADDR: if (data == NULL) { return (EINVAL); } bcopy ((char *)END_HADDR(&pDrvCtrl->end), (char *)data, END_HADDR_LEN(&pDrvCtrl->end)); break; case EIOCSFLAGS: value = (long)data; if (value < 0) { value = -(--value); END_FLAGS_CLR (&pDrvCtrl->end, value); } else { END_FLAGS_SET (&pDrvCtrl->end, value); } NetdrvConfig(pDrvCtrl); break; case EIOCGFLAGS: *(int *)data = END_FLAGS_GET(&pDrvCtrl->end); break; case EIOCPOLLSTART: /* Begin polled operation */ NetdrvPollStart (pDrvCtrl); break; case EIOCPOLLSTOP: /* End polled operation */ NetdrvPollStop (pDrvCtrl); break; case EIOCGMIB2: /* return MIB information */ if(data == NULL) { return (EINVAL); } bcopy((char *)&pDrvCtrl->end.mib2Tbl, (char *)data, sizeof(pDrvCtrl->end.mib2Tbl)); break; case EIOCGFBUF: /* return minimum First Buffer for chaining */ if(data == NULL) { return (EINVAL); } *(int *)data = NETDRV_MIN_FBUF; break; default: error = EINVAL; } return (error); }
LOCAL int mirrorEndIoctl ( END_CTRL* pDrvCtrl, int cmd, caddr_t data ) { int error = 0; long value; END_OBJ* pEndObj = &pDrvCtrl->endObject; END_MEDIA * pMedia; switch ((UINT)cmd) { case EIOCSADDR: if (data == NULL) { error = EINVAL; } else { bcopy((char*)data, (char*)END_HADDR(pEndObj), END_HADDR_LEN(pEndObj)); } break; case EIOCGADDR: if (data == NULL) { error = EINVAL; } else { bcopy((char*)END_HADDR(pEndObj), (char*)data, END_HADDR_LEN(pEndObj)); } break; case EIOCSFLAGS: value = (long)data; if (value < 0) { value = -value; value--; END_FLAGS_CLR(pEndObj, value); } else { END_FLAGS_SET(pEndObj, value); } if (END_FLAGS_GET(pEndObj) & IP_IFF_PROMISC) { pDrvCtrl->promiscuous = TRUE; } else { pDrvCtrl->promiscuous = FALSE; } break; case EIOCGFLAGS: if (data == NULL) { error = EINVAL; } else { *(int*)data = END_FLAGS_GET(pEndObj); } break; case EIOCGIFMEDIA: if (data == NULL) error = EINVAL; else { value = END_FLAGS_GET(pEndObj); pMedia = (END_MEDIA *)data; pMedia->endMediaActive = IFM_AVALID; pMedia->endMediaStatus = IFM_AVALID; if (value & IP_IFF_RUNNING) { LOG_MSG("ioctl with EIOCGIFMEDIA, set active bit \n", 1, 2, 3, 4, 5, 6); pMedia->endMediaStatus |= IFM_ACTIVE; } else { LOG_MSG("ioctl with EIOCGIFMEDIA, clear active bit \n", 1, 2, 3, 4, 5, 6); pMedia->endMediaStatus &= ~IFM_ACTIVE; } } break; case EIOCPOLLSTART: error = mirrorEndPollStart(pDrvCtrl); break; case EIOCPOLLSTOP: error = mirrorEndPollStop(pDrvCtrl); break; case EIOCGMIB2: if (data == NULL) { error = EINVAL; } else { bcopy((char*)&pDrvCtrl->endObject.mib2Tbl, (char*)data, sizeof(pDrvCtrl->endObject.mib2Tbl)); } break; case EIOCGFBUF: if (data == NULL) { error = EINVAL; } else { *(int*)data = LENGTH_MIN_FBUF; } break; default: error = EINVAL; break; } return error; }