ena.c (7926bc4492a9a5c1e12595355d5c11121eb51f4b) ena.c (6959869eaea77fbdc99e46523daeb896662d9cca)
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2019 Amazon.com, Inc. or its affiliates.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 1893 unchanged lines hidden (view full) ---

1902}
1903
1904static void
1905ena_media_status(if_t ifp, struct ifmediareq *ifmr)
1906{
1907 struct ena_adapter *adapter = if_getsoftc(ifp);
1908 ena_trace(ENA_DBG, "enter\n");
1909
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2019 Amazon.com, Inc. or its affiliates.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 1893 unchanged lines hidden (view full) ---

1902}
1903
1904static void
1905ena_media_status(if_t ifp, struct ifmediareq *ifmr)
1906{
1907 struct ena_adapter *adapter = if_getsoftc(ifp);
1908 ena_trace(ENA_DBG, "enter\n");
1909
1910 mtx_lock(&adapter->global_mtx);
1910 ENA_LOCK_LOCK(adapter);
1911
1912 ifmr->ifm_status = IFM_AVALID;
1913 ifmr->ifm_active = IFM_ETHER;
1914
1915 if (!ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)) {
1911
1912 ifmr->ifm_status = IFM_AVALID;
1913 ifmr->ifm_active = IFM_ETHER;
1914
1915 if (!ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)) {
1916 mtx_unlock(&adapter->global_mtx);
1916 ENA_LOCK_UNLOCK(adapter);
1917 ena_trace(ENA_INFO, "Link is down\n");
1918 return;
1919 }
1920
1921 ifmr->ifm_status |= IFM_ACTIVE;
1922 ifmr->ifm_active |= IFM_UNKNOWN | IFM_FDX;
1923
1917 ena_trace(ENA_INFO, "Link is down\n");
1918 return;
1919 }
1920
1921 ifmr->ifm_status |= IFM_ACTIVE;
1922 ifmr->ifm_active |= IFM_UNKNOWN | IFM_FDX;
1923
1924 mtx_unlock(&adapter->global_mtx);
1924 ENA_LOCK_UNLOCK(adapter);
1925}
1926
1927static void
1928ena_init(void *arg)
1929{
1930 struct ena_adapter *adapter = (struct ena_adapter *)arg;
1931
1932 if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
1925}
1926
1927static void
1928ena_init(void *arg)
1929{
1930 struct ena_adapter *adapter = (struct ena_adapter *)arg;
1931
1932 if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
1933 sx_xlock(&adapter->ioctl_sx);
1933 ENA_LOCK_LOCK(adapter);
1934 ena_up(adapter);
1934 ena_up(adapter);
1935 sx_unlock(&adapter->ioctl_sx);
1935 ENA_LOCK_UNLOCK(adapter);
1936 }
1937}
1938
1939static int
1940ena_ioctl(if_t ifp, u_long command, caddr_t data)
1941{
1942 struct ena_adapter *adapter;
1943 struct ifreq *ifr;

--- 5 unchanged lines hidden (view full) ---

1949 /*
1950 * Acquiring lock to prevent from running up and down routines parallel.
1951 */
1952 rc = 0;
1953 switch (command) {
1954 case SIOCSIFMTU:
1955 if (ifp->if_mtu == ifr->ifr_mtu)
1956 break;
1936 }
1937}
1938
1939static int
1940ena_ioctl(if_t ifp, u_long command, caddr_t data)
1941{
1942 struct ena_adapter *adapter;
1943 struct ifreq *ifr;

--- 5 unchanged lines hidden (view full) ---

1949 /*
1950 * Acquiring lock to prevent from running up and down routines parallel.
1951 */
1952 rc = 0;
1953 switch (command) {
1954 case SIOCSIFMTU:
1955 if (ifp->if_mtu == ifr->ifr_mtu)
1956 break;
1957 sx_xlock(&adapter->ioctl_sx);
1957 ENA_LOCK_LOCK(adapter);
1958 ena_down(adapter);
1959
1960 ena_change_mtu(ifp, ifr->ifr_mtu);
1961
1962 rc = ena_up(adapter);
1958 ena_down(adapter);
1959
1960 ena_change_mtu(ifp, ifr->ifr_mtu);
1961
1962 rc = ena_up(adapter);
1963 sx_unlock(&adapter->ioctl_sx);
1963 ENA_LOCK_UNLOCK(adapter);
1964 break;
1965
1966 case SIOCSIFFLAGS:
1967 if ((ifp->if_flags & IFF_UP) != 0) {
1968 if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
1969 if ((ifp->if_flags & (IFF_PROMISC |
1970 IFF_ALLMULTI)) != 0) {
1971 device_printf(adapter->pdev,
1972 "ioctl promisc/allmulti\n");
1973 }
1974 } else {
1964 break;
1965
1966 case SIOCSIFFLAGS:
1967 if ((ifp->if_flags & IFF_UP) != 0) {
1968 if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
1969 if ((ifp->if_flags & (IFF_PROMISC |
1970 IFF_ALLMULTI)) != 0) {
1971 device_printf(adapter->pdev,
1972 "ioctl promisc/allmulti\n");
1973 }
1974 } else {
1975 sx_xlock(&adapter->ioctl_sx);
1975 ENA_LOCK_LOCK(adapter);
1976 rc = ena_up(adapter);
1976 rc = ena_up(adapter);
1977 sx_unlock(&adapter->ioctl_sx);
1977 ENA_LOCK_UNLOCK(adapter);
1978 }
1979 } else {
1980 if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
1978 }
1979 } else {
1980 if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
1981 sx_xlock(&adapter->ioctl_sx);
1981 ENA_LOCK_LOCK(adapter);
1982 ena_down(adapter);
1982 ena_down(adapter);
1983 sx_unlock(&adapter->ioctl_sx);
1983 ENA_LOCK_UNLOCK(adapter);
1984 }
1985 }
1986 break;
1987
1988 case SIOCADDMULTI:
1989 case SIOCDELMULTI:
1990 break;
1991

--- 8 unchanged lines hidden (view full) ---

2000
2001 if (ifr->ifr_reqcap != ifp->if_capenable) {
2002 ifp->if_capenable = ifr->ifr_reqcap;
2003 reinit = 1;
2004 }
2005
2006 if ((reinit != 0) &&
2007 ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)) {
1984 }
1985 }
1986 break;
1987
1988 case SIOCADDMULTI:
1989 case SIOCDELMULTI:
1990 break;
1991

--- 8 unchanged lines hidden (view full) ---

2000
2001 if (ifr->ifr_reqcap != ifp->if_capenable) {
2002 ifp->if_capenable = ifr->ifr_reqcap;
2003 reinit = 1;
2004 }
2005
2006 if ((reinit != 0) &&
2007 ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)) {
2008 sx_xlock(&adapter->ioctl_sx);
2008 ENA_LOCK_LOCK(adapter);
2009 ena_down(adapter);
2010 rc = ena_up(adapter);
2009 ena_down(adapter);
2010 rc = ena_up(adapter);
2011 sx_unlock(&adapter->ioctl_sx);
2011 ENA_LOCK_UNLOCK(adapter);
2012 }
2013 }
2014
2015 break;
2016 default:
2017 rc = ether_ioctl(ifp, command, data);
2018 break;
2019 }

--- 1155 unchanged lines hidden (view full) ---

3175 struct ena_adapter *adapter = (struct ena_adapter *)arg;
3176
3177 if (unlikely(!ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
3178 device_printf(adapter->pdev,
3179 "device reset scheduled but trigger_reset is off\n");
3180 return;
3181 }
3182
2012 }
2013 }
2014
2015 break;
2016 default:
2017 rc = ether_ioctl(ifp, command, data);
2018 break;
2019 }

--- 1155 unchanged lines hidden (view full) ---

3175 struct ena_adapter *adapter = (struct ena_adapter *)arg;
3176
3177 if (unlikely(!ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
3178 device_printf(adapter->pdev,
3179 "device reset scheduled but trigger_reset is off\n");
3180 return;
3181 }
3182
3183 sx_xlock(&adapter->ioctl_sx);
3183 ENA_LOCK_LOCK(adapter);
3184 ena_destroy_device(adapter, false);
3185 ena_restore_device(adapter);
3184 ena_destroy_device(adapter, false);
3185 ena_restore_device(adapter);
3186 sx_unlock(&adapter->ioctl_sx);
3186 ENA_LOCK_UNLOCK(adapter);
3187}
3188
3189/**
3190 * ena_attach - Device Initialization Routine
3191 * @pdev: device information struct
3192 *
3193 * Returns 0 on success, otherwise on failure.
3194 *

--- 12 unchanged lines hidden (view full) ---

3207 struct ena_com_dev *ena_dev = NULL;
3208 const char *queue_type_str;
3209 int io_queue_num;
3210 int rid, rc;
3211
3212 adapter = device_get_softc(pdev);
3213 adapter->pdev = pdev;
3214
3187}
3188
3189/**
3190 * ena_attach - Device Initialization Routine
3191 * @pdev: device information struct
3192 *
3193 * Returns 0 on success, otherwise on failure.
3194 *

--- 12 unchanged lines hidden (view full) ---

3207 struct ena_com_dev *ena_dev = NULL;
3208 const char *queue_type_str;
3209 int io_queue_num;
3210 int rid, rc;
3211
3212 adapter = device_get_softc(pdev);
3213 adapter->pdev = pdev;
3214
3215 mtx_init(&adapter->global_mtx, "ENA global mtx", NULL, MTX_DEF);
3216 sx_init(&adapter->ioctl_sx, "ENA ioctl sx");
3215 ENA_LOCK_INIT(adapter);
3217
3216
3218 /* Set up the timer service */
3219 callout_init_mtx(&adapter->timer_service, &adapter->global_mtx, 0);
3217 /*
3218 * Set up the timer service - driver is responsible for avoiding
3219 * concurrency, as the callout won't be using any locking inside.
3220 */
3221 callout_init(&adapter->timer_service, true);
3220 adapter->keep_alive_timeout = DEFAULT_KEEP_ALIVE_TO;
3221 adapter->missing_tx_timeout = DEFAULT_TX_CMP_TO;
3222 adapter->missing_tx_max_queues = DEFAULT_TX_MONITORED_QUEUES;
3223 adapter->missing_tx_threshold = DEFAULT_TX_CMP_THRESHOLD;
3224
3225 if (version_printed++ == 0)
3226 device_printf(pdev, "%s\n", ena_version);
3227

--- 202 unchanged lines hidden (view full) ---

3430 /* Make sure VLANS are not using driver */
3431 if (adapter->ifp->if_vlantrunk != NULL) {
3432 device_printf(adapter->pdev ,"VLAN is in use, detach first\n");
3433 return (EBUSY);
3434 }
3435
3436 ether_ifdetach(adapter->ifp);
3437
3222 adapter->keep_alive_timeout = DEFAULT_KEEP_ALIVE_TO;
3223 adapter->missing_tx_timeout = DEFAULT_TX_CMP_TO;
3224 adapter->missing_tx_max_queues = DEFAULT_TX_MONITORED_QUEUES;
3225 adapter->missing_tx_threshold = DEFAULT_TX_CMP_THRESHOLD;
3226
3227 if (version_printed++ == 0)
3228 device_printf(pdev, "%s\n", ena_version);
3229

--- 202 unchanged lines hidden (view full) ---

3432 /* Make sure VLANS are not using driver */
3433 if (adapter->ifp->if_vlantrunk != NULL) {
3434 device_printf(adapter->pdev ,"VLAN is in use, detach first\n");
3435 return (EBUSY);
3436 }
3437
3438 ether_ifdetach(adapter->ifp);
3439
3438 /* Free reset task and callout */
3440 /* Stop timer service */
3441 ENA_LOCK_LOCK(adapter);
3439 callout_drain(&adapter->timer_service);
3442 callout_drain(&adapter->timer_service);
3443 ENA_LOCK_UNLOCK(adapter);
3444
3445 /* Release reset task */
3440 while (taskqueue_cancel(adapter->reset_tq, &adapter->reset_task, NULL))
3441 taskqueue_drain(adapter->reset_tq, &adapter->reset_task);
3442 taskqueue_free(adapter->reset_tq);
3443
3446 while (taskqueue_cancel(adapter->reset_tq, &adapter->reset_task, NULL))
3447 taskqueue_drain(adapter->reset_tq, &adapter->reset_task);
3448 taskqueue_free(adapter->reset_tq);
3449
3444 sx_xlock(&adapter->ioctl_sx);
3450 ENA_LOCK_LOCK(adapter);
3445 ena_down(adapter);
3446 ena_destroy_device(adapter, true);
3451 ena_down(adapter);
3452 ena_destroy_device(adapter, true);
3447 sx_unlock(&adapter->ioctl_sx);
3453 ENA_LOCK_UNLOCK(adapter);
3448
3449#ifdef DEV_NETMAP
3450 netmap_detach(adapter->ifp);
3451#endif /* DEV_NETMAP */
3452
3453 ena_free_all_io_rings_resources(adapter);
3454
3455 ena_free_counters((counter_u64_t *)&adapter->hw_stats,

--- 15 unchanged lines hidden (view full) ---

3471
3472 ena_free_pci_resources(adapter);
3473
3474 if (likely(ENA_FLAG_ISSET(ENA_FLAG_RSS_ACTIVE, adapter)))
3475 ena_com_rss_destroy(ena_dev);
3476
3477 ena_com_delete_host_info(ena_dev);
3478
3454
3455#ifdef DEV_NETMAP
3456 netmap_detach(adapter->ifp);
3457#endif /* DEV_NETMAP */
3458
3459 ena_free_all_io_rings_resources(adapter);
3460
3461 ena_free_counters((counter_u64_t *)&adapter->hw_stats,

--- 15 unchanged lines hidden (view full) ---

3477
3478 ena_free_pci_resources(adapter);
3479
3480 if (likely(ENA_FLAG_ISSET(ENA_FLAG_RSS_ACTIVE, adapter)))
3481 ena_com_rss_destroy(ena_dev);
3482
3483 ena_com_delete_host_info(ena_dev);
3484
3479 mtx_destroy(&adapter->global_mtx);
3480 sx_destroy(&adapter->ioctl_sx);
3485 ENA_LOCK_DESTROY(adapter);
3481
3482 if_free(adapter->ifp);
3483
3484 if (ena_dev->bus != NULL)
3485 free(ena_dev->bus, M_DEVBUF);
3486
3487 if (ena_dev != NULL)
3488 free(ena_dev, M_DEVBUF);

--- 109 unchanged lines hidden ---
3486
3487 if_free(adapter->ifp);
3488
3489 if (ena_dev->bus != NULL)
3490 free(ena_dev->bus, M_DEVBUF);
3491
3492 if (ena_dev != NULL)
3493 free(ena_dev, M_DEVBUF);

--- 109 unchanged lines hidden ---