Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/ena/ena.c
Show First 20 Lines • Show All 2,279 Lines • ▼ Show 20 Lines | ena_ioctl(if_t ifp, u_long command, caddr_t data) | ||||
int rc; | int rc; | ||||
adapter = ifp->if_softc; | adapter = ifp->if_softc; | ||||
ifr = (struct ifreq *)data; | ifr = (struct ifreq *)data; | ||||
/* | /* | ||||
* Acquiring lock to prevent from running up and down routines parallel. | * Acquiring lock to prevent from running up and down routines parallel. | ||||
*/ | */ | ||||
sx_xlock(&adapter->ioctl_sx); | |||||
rc = 0; | rc = 0; | ||||
switch (command) { | switch (command) { | ||||
case SIOCSIFMTU: | case SIOCSIFMTU: | ||||
sx_xlock(&adapter->ioctl_sx); | |||||
ena_down(adapter); | ena_down(adapter); | ||||
ena_change_mtu(ifp, ifr->ifr_mtu); | ena_change_mtu(ifp, ifr->ifr_mtu); | ||||
rc = ena_up(adapter); | rc = ena_up(adapter); | ||||
sx_unlock(&adapter->ioctl_sx); | |||||
break; | break; | ||||
case SIOCSIFFLAGS: | case SIOCSIFFLAGS: | ||||
if (ifp->if_flags & IFF_UP) { | if (ifp->if_flags & IFF_UP) { | ||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) { | if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) { | ||||
if (ifp->if_flags & (IFF_PROMISC | | if (ifp->if_flags & (IFF_PROMISC | | ||||
IFF_ALLMULTI)) { | IFF_ALLMULTI)) { | ||||
device_printf(adapter->pdev, | device_printf(adapter->pdev, | ||||
"ioctl promisc/allmulti\n"); | "ioctl promisc/allmulti\n"); | ||||
} | } | ||||
} else { | } else { | ||||
sx_xlock(&adapter->ioctl_sx); | |||||
rc = ena_up(adapter); | rc = ena_up(adapter); | ||||
sx_unlock(&adapter->ioctl_sx); | |||||
} | } | ||||
} else { | } else { | ||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) | if (ifp->if_drv_flags & IFF_DRV_RUNNING) { | ||||
sx_xlock(&adapter->ioctl_sx); | |||||
ena_down(adapter); | ena_down(adapter); | ||||
sx_unlock(&adapter->ioctl_sx); | |||||
} | } | ||||
} | |||||
break; | break; | ||||
case SIOCADDMULTI: | case SIOCADDMULTI: | ||||
case SIOCDELMULTI: | case SIOCDELMULTI: | ||||
break; | break; | ||||
case SIOCSIFMEDIA: | case SIOCSIFMEDIA: | ||||
case SIOCGIFMEDIA: | case SIOCGIFMEDIA: | ||||
rc = ifmedia_ioctl(ifp, ifr, &adapter->media, command); | rc = ifmedia_ioctl(ifp, ifr, &adapter->media, command); | ||||
break; | break; | ||||
case SIOCSIFCAP: | case SIOCSIFCAP: | ||||
{ | { | ||||
int reinit = 0; | int reinit = 0; | ||||
if (ifr->ifr_reqcap != ifp->if_capenable) { | if (ifr->ifr_reqcap != ifp->if_capenable) { | ||||
ifp->if_capenable = ifr->ifr_reqcap; | ifp->if_capenable = ifr->ifr_reqcap; | ||||
reinit = 1; | reinit = 1; | ||||
} | } | ||||
if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING)) { | if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING)) { | ||||
sx_xlock(&adapter->ioctl_sx); | |||||
ena_down(adapter); | ena_down(adapter); | ||||
rc = ena_up(adapter); | rc = ena_up(adapter); | ||||
sx_unlock(&adapter->ioctl_sx); | |||||
} | } | ||||
} | } | ||||
break; | break; | ||||
default: | default: | ||||
rc = ether_ioctl(ifp, command, data); | rc = ether_ioctl(ifp, command, data); | ||||
break; | break; | ||||
} | } | ||||
sx_unlock(&adapter->ioctl_sx); | |||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | static int | ||||
ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *feat) | ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *feat) | ||||
{ | { | ||||
int caps = 0; | int caps = 0; | ||||
▲ Show 20 Lines • Show All 1,304 Lines • ▼ Show 20 Lines | ena_detach(device_t pdev) | ||||
} | } | ||||
/* Free reset task and callout */ | /* Free reset task and callout */ | ||||
callout_drain(&adapter->timer_service); | callout_drain(&adapter->timer_service); | ||||
while (taskqueue_cancel(adapter->reset_tq, &adapter->reset_task, NULL)) | while (taskqueue_cancel(adapter->reset_tq, &adapter->reset_task, NULL)) | ||||
taskqueue_drain(adapter->reset_tq, &adapter->reset_task); | taskqueue_drain(adapter->reset_tq, &adapter->reset_task); | ||||
taskqueue_free(adapter->reset_tq); | taskqueue_free(adapter->reset_tq); | ||||
sx_xlock(&adapter->ioctl_sx); | |||||
ena_down(adapter); | ena_down(adapter); | ||||
sx_unlock(&adapter->ioctl_sx); | |||||
if (adapter->ifp != NULL) { | if (adapter->ifp != NULL) { | ||||
ether_ifdetach(adapter->ifp); | ether_ifdetach(adapter->ifp); | ||||
if_free(adapter->ifp); | if_free(adapter->ifp); | ||||
} | } | ||||
ena_free_all_io_rings_resources(adapter); | ena_free_all_io_rings_resources(adapter); | ||||
▲ Show 20 Lines • Show All 119 Lines • Show Last 20 Lines |