Esempio n. 1
0
File: netdrv.c Progetto: ariavie/bcm
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);
}
Esempio n. 2
0
File: netdrv.c Progetto: ariavie/bcm
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;
    }