1
1

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;
}