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