80 строки
1.9 KiB
C
80 строки
1.9 KiB
C
/*
|
|
* (c) 2016-2017, SWD Embedded Systems Limited, http://www.kpda.ru
|
|
*/
|
|
|
|
/*****************************************************************************
|
|
* *
|
|
* Driver for the Intel 8255x 10/100 Mbps Ethernet Controller Family *
|
|
* Network controller DEVCTL routines *
|
|
* *
|
|
*****************************************************************************/
|
|
|
|
|
|
#include "e100.h"
|
|
|
|
int e100_ioctl(struct ifnet * ifp, unsigned long cmd, caddr_t data)
|
|
{
|
|
int error = 0;
|
|
e100_dev_t *e100 = ifp->if_softc;
|
|
struct drvcom_config *dcfgp;
|
|
struct drvcom_stats *dstp;
|
|
struct ifdrv_com *ifdc;
|
|
|
|
switch (cmd) {
|
|
case SIOCGDRVCOM:
|
|
ifdc = (struct ifdrv_com *)data;
|
|
switch (ifdc->ifdc_cmd) {
|
|
case DRVCOM_CONFIG:
|
|
dcfgp = (struct drvcom_config *)ifdc;
|
|
|
|
if (ifdc->ifdc_len != sizeof(nic_config_t)) {
|
|
error = EINVAL;
|
|
break;
|
|
}
|
|
memcpy(&dcfgp->dcom_config, &e100->cfg, sizeof(e100->cfg));
|
|
break;
|
|
|
|
case DRVCOM_STATS:
|
|
dstp = (struct drvcom_stats *)ifdc;
|
|
|
|
if (ifdc->ifdc_len != sizeof(nic_stats_t)) {
|
|
error = EINVAL;
|
|
break;
|
|
}
|
|
memcpy(&dstp->dcom_stats, &e100->stats, sizeof(e100->stats));
|
|
if (e100->cfg.verbose > 1) {
|
|
e100_hw_dump_registers(e100, 0);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
error = ENOTTY;
|
|
}
|
|
break;
|
|
|
|
|
|
case SIOCSIFMEDIA:
|
|
case SIOCGIFMEDIA: {
|
|
struct ifreq *ifr = (struct ifreq *)data;
|
|
|
|
error = ifmedia_ioctl(ifp, ifr, &e100->bsd_mii.mii_media, cmd);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
error = ether_ioctl(ifp, cmd, data);
|
|
if (error == ENETRESET) {
|
|
/*
|
|
* Multicast list has changed; set the
|
|
* hardware filter accordingly.
|
|
*/
|
|
if (ifp->if_init != NULL)
|
|
ifp->if_init(ifp);
|
|
error = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return error;
|
|
}
|