ena.c (e2735b095b7e31a6e07b8639ed151456a610bc07) ena.c (56d41ad5fe9c2fcbc2363bf3ca7e69684a26b4bd)
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

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

1234 }
1235
1236 ENA_LOCK_UNLOCK(adapter);
1237
1238 return (rc);
1239}
1240
1241static void
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

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

1234 }
1235
1236 ENA_LOCK_UNLOCK(adapter);
1237
1238 return (rc);
1239}
1240
1241static void
1242ena_update_io_rings(struct ena_adapter *adapter, uint32_t num)
1243{
1244 ena_free_all_io_rings_resources(adapter);
1245 /* Force indirection table to be reinitialized */
1246 ena_com_rss_destroy(adapter->ena_dev);
1247
1248 adapter->num_io_queues = num;
1249 ena_init_io_rings(adapter);
1250}
1251
1252/* Caller should sanitize new_num */
1253int
1254ena_update_io_queue_nb(struct ena_adapter *adapter, uint32_t new_num)
1255{
1256 uint32_t old_num;
1257 int rc = 0;
1258 bool dev_was_up;
1259
1260 ENA_LOCK_LOCK(adapter);
1261
1262 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1263 old_num = adapter->num_io_queues;
1264 ena_down(adapter);
1265
1266 ena_update_io_rings(adapter, new_num);
1267
1268 if (dev_was_up) {
1269 rc = ena_up(adapter);
1270 if (unlikely(rc != 0)) {
1271 device_printf(adapter->pdev,
1272 "Failed to configure device with %u IO queues. "
1273 "Reverting to previous value: %u\n",
1274 new_num, old_num);
1275
1276 ena_update_io_rings(adapter, old_num);
1277
1278 rc = ena_up(adapter);
1279 if (unlikely(rc != 0)) {
1280 device_printf(adapter->pdev,
1281 "Failed to revert to previous setup IO "
1282 "queues. Triggering device reset.\n");
1283 ENA_FLAG_SET_ATOMIC(
1284 ENA_FLAG_DEV_UP_BEFORE_RESET, adapter);
1285 ena_trigger_reset(adapter,
1286 ENA_REGS_RESET_OS_TRIGGER);
1287 }
1288 }
1289 }
1290
1291 ENA_LOCK_UNLOCK(adapter);
1292
1293 return (rc);
1294}
1295
1296static void
1242ena_free_rx_bufs(struct ena_adapter *adapter, unsigned int qid)
1243{
1244 struct ena_ring *rx_ring = &adapter->rx_ring[qid];
1245 unsigned int i;
1246
1247 for (i = 0; i < rx_ring->ring_size; i++) {
1248 struct ena_rx_buffer *rx_info = &rx_ring->rx_buffer_info[i];
1249

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

1860
1861/* Configure the Rx forwarding */
1862static int
1863ena_rss_configure(struct ena_adapter *adapter)
1864{
1865 struct ena_com_dev *ena_dev = adapter->ena_dev;
1866 int rc;
1867
1297ena_free_rx_bufs(struct ena_adapter *adapter, unsigned int qid)
1298{
1299 struct ena_ring *rx_ring = &adapter->rx_ring[qid];
1300 unsigned int i;
1301
1302 for (i = 0; i < rx_ring->ring_size; i++) {
1303 struct ena_rx_buffer *rx_info = &rx_ring->rx_buffer_info[i];
1304

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

1915
1916/* Configure the Rx forwarding */
1917static int
1918ena_rss_configure(struct ena_adapter *adapter)
1919{
1920 struct ena_com_dev *ena_dev = adapter->ena_dev;
1921 int rc;
1922
1923 /* In case the RSS table was destroyed */
1924 if (!ena_dev->rss.tbl_log_size) {
1925 rc = ena_rss_init_default(adapter);
1926 if (unlikely((rc != 0) && (rc != EOPNOTSUPP))) {
1927 device_printf(adapter->pdev,
1928 "WARNING: RSS was not properly re-initialized,"
1929 " it will affect bandwidth\n");
1930 ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_RSS_ACTIVE, adapter);
1931 return (rc);
1932 }
1933 }
1934
1868 /* Set indirect table */
1869 rc = ena_com_indirect_table_set(ena_dev);
1870 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))
1871 return (rc);
1872
1873 /* Configure hash function (if supported) */
1874 rc = ena_com_set_hash_function(ena_dev);
1875 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))

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

1885
1886static int
1887ena_up_complete(struct ena_adapter *adapter)
1888{
1889 int rc;
1890
1891 if (likely(ENA_FLAG_ISSET(ENA_FLAG_RSS_ACTIVE, adapter))) {
1892 rc = ena_rss_configure(adapter);
1935 /* Set indirect table */
1936 rc = ena_com_indirect_table_set(ena_dev);
1937 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))
1938 return (rc);
1939
1940 /* Configure hash function (if supported) */
1941 rc = ena_com_set_hash_function(ena_dev);
1942 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))

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

1952
1953static int
1954ena_up_complete(struct ena_adapter *adapter)
1955{
1956 int rc;
1957
1958 if (likely(ENA_FLAG_ISSET(ENA_FLAG_RSS_ACTIVE, adapter))) {
1959 rc = ena_rss_configure(adapter);
1893 if (rc != 0)
1960 if (rc != 0) {
1961 device_printf(adapter->pdev,
1962 "Failed to configure RSS\n");
1894 return (rc);
1963 return (rc);
1964 }
1895 }
1896
1897 rc = ena_change_mtu(adapter->ifp, adapter->ifp->if_mtu);
1898 if (unlikely(rc != 0))
1899 return (rc);
1900
1901 ena_refill_all_rx_bufs(adapter);
1902 ena_reset_counters((counter_u64_t *)&adapter->hw_stats,

--- 1786 unchanged lines hidden ---
1965 }
1966
1967 rc = ena_change_mtu(adapter->ifp, adapter->ifp->if_mtu);
1968 if (unlikely(rc != 0))
1969 return (rc);
1970
1971 ena_refill_all_rx_bufs(adapter);
1972 ena_reset_counters((counter_u64_t *)&adapter->hw_stats,

--- 1786 unchanged lines hidden ---