ena.c (a33ec635d1f6d574d54e6f6d74766d070183be4c) ena.c (f9c9c01de87e0440380b939c684d9939d48ce175)
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2015-2024 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

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

166static void ena_update_on_link_change(void *, struct ena_admin_aenq_entry *);
167static void unimplemented_aenq_handler(void *, struct ena_admin_aenq_entry *);
168static int ena_copy_eni_metrics(struct ena_adapter *);
169static int ena_copy_srd_metrics(struct ena_adapter *);
170static int ena_copy_customer_metrics(struct ena_adapter *);
171static void ena_timer_service(void *);
172static enum ena_regs_reset_reason_types check_cdesc_in_tx_cq(struct ena_adapter *,
173 struct ena_ring *);
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2015-2024 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

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

166static void ena_update_on_link_change(void *, struct ena_admin_aenq_entry *);
167static void unimplemented_aenq_handler(void *, struct ena_admin_aenq_entry *);
168static int ena_copy_eni_metrics(struct ena_adapter *);
169static int ena_copy_srd_metrics(struct ena_adapter *);
170static int ena_copy_customer_metrics(struct ena_adapter *);
171static void ena_timer_service(void *);
172static enum ena_regs_reset_reason_types check_cdesc_in_tx_cq(struct ena_adapter *,
173 struct ena_ring *);
174#ifdef DEV_NETMAP
175static int ena_reinit_netmap(struct ena_adapter *adapter);
176#endif
174
177
175
176static char ena_version[] = ENA_DEVICE_NAME ENA_DRV_MODULE_NAME
177 " v" ENA_DRV_MODULE_VERSION;
178
179static ena_vendor_info_t ena_vendor_info_array[] = {
180 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_PF, 0 },
181 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_PF_RSERV0, 0 },
182 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_VF, 0 },
183 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_VF_RSERV0, 0 },

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

1157
1158 if (likely(i != 0))
1159 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1160
1161 rx_ring->next_to_use = next_to_use;
1162 return (i);
1163}
1164
178static char ena_version[] = ENA_DEVICE_NAME ENA_DRV_MODULE_NAME
179 " v" ENA_DRV_MODULE_VERSION;
180
181static ena_vendor_info_t ena_vendor_info_array[] = {
182 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_PF, 0 },
183 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_PF_RSERV0, 0 },
184 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_VF, 0 },
185 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_VF_RSERV0, 0 },

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

1159
1160 if (likely(i != 0))
1161 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1162
1163 rx_ring->next_to_use = next_to_use;
1164 return (i);
1165}
1166
1167#ifdef DEV_NETMAP
1168static int
1169ena_reinit_netmap(struct ena_adapter *adapter)
1170{
1171 int rc;
1172
1173 netmap_detach(adapter->ifp);
1174 rc = ena_netmap_attach(adapter);
1175 if (rc != 0)
1176 ena_log(adapter->pdev, ERR, "netmap attach failed: %d\n", rc);
1177
1178 return rc;
1179}
1180
1181#endif /* DEV_NETMAP */
1165int
1166ena_update_buf_ring_size(struct ena_adapter *adapter,
1167 uint32_t new_buf_ring_size)
1168{
1169 uint32_t old_buf_ring_size;
1170 int rc = 0;
1171 bool dev_was_up;
1172
1173 old_buf_ring_size = adapter->buf_ring_size;
1174 adapter->buf_ring_size = new_buf_ring_size;
1175
1176 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1177 ena_down(adapter);
1178
1179 /* Reconfigure buf ring for all Tx rings. */
1180 ena_free_all_io_rings_resources(adapter);
1181 ena_init_io_rings_advanced(adapter);
1182int
1183ena_update_buf_ring_size(struct ena_adapter *adapter,
1184 uint32_t new_buf_ring_size)
1185{
1186 uint32_t old_buf_ring_size;
1187 int rc = 0;
1188 bool dev_was_up;
1189
1190 old_buf_ring_size = adapter->buf_ring_size;
1191 adapter->buf_ring_size = new_buf_ring_size;
1192
1193 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1194 ena_down(adapter);
1195
1196 /* Reconfigure buf ring for all Tx rings. */
1197 ena_free_all_io_rings_resources(adapter);
1198 ena_init_io_rings_advanced(adapter);
1199#ifdef DEV_NETMAP
1200 rc = ena_reinit_netmap(adapter);
1201 if (rc != 0)
1202 return rc;
1203
1204#endif /* DEV_NETMAP */
1182 if (dev_was_up) {
1183 /*
1184 * If ena_up() fails, it's not because of recent buf_ring size
1185 * changes. Because of that, we just want to revert old drbr
1186 * value and trigger the reset because something else had to
1187 * go wrong.
1188 */
1189 rc = ena_up(adapter);
1190 if (unlikely(rc != 0)) {
1191 ena_log(adapter->pdev, ERR,
1192 "Failed to configure device after setting new drbr size: %u. Reverting old value: %u and triggering the reset\n",
1193 new_buf_ring_size, old_buf_ring_size);
1194
1195 /* Revert old size and trigger the reset */
1196 adapter->buf_ring_size = old_buf_ring_size;
1197 ena_free_all_io_rings_resources(adapter);
1198 ena_init_io_rings_advanced(adapter);
1205 if (dev_was_up) {
1206 /*
1207 * If ena_up() fails, it's not because of recent buf_ring size
1208 * changes. Because of that, we just want to revert old drbr
1209 * value and trigger the reset because something else had to
1210 * go wrong.
1211 */
1212 rc = ena_up(adapter);
1213 if (unlikely(rc != 0)) {
1214 ena_log(adapter->pdev, ERR,
1215 "Failed to configure device after setting new drbr size: %u. Reverting old value: %u and triggering the reset\n",
1216 new_buf_ring_size, old_buf_ring_size);
1217
1218 /* Revert old size and trigger the reset */
1219 adapter->buf_ring_size = old_buf_ring_size;
1220 ena_free_all_io_rings_resources(adapter);
1221 ena_init_io_rings_advanced(adapter);
1222#ifdef DEV_NETMAP
1223 rc = ena_reinit_netmap(adapter);
1224 if (rc != 0)
1225 return rc;
1199
1226
1227#endif /* DEV_NETMAP */
1200 ENA_FLAG_SET_ATOMIC(ENA_FLAG_DEV_UP_BEFORE_RESET,
1201 adapter);
1202 ena_trigger_reset(adapter, ENA_REGS_RESET_OS_TRIGGER);
1203 }
1204 }
1205
1206 return (rc);
1207}

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

1219 adapter->requested_tx_ring_size = new_tx_size;
1220 adapter->requested_rx_ring_size = new_rx_size;
1221
1222 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1223 ena_down(adapter);
1224
1225 /* Configure queues with new size. */
1226 ena_init_io_rings_basic(adapter);
1228 ENA_FLAG_SET_ATOMIC(ENA_FLAG_DEV_UP_BEFORE_RESET,
1229 adapter);
1230 ena_trigger_reset(adapter, ENA_REGS_RESET_OS_TRIGGER);
1231 }
1232 }
1233
1234 return (rc);
1235}

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

1247 adapter->requested_tx_ring_size = new_tx_size;
1248 adapter->requested_rx_ring_size = new_rx_size;
1249
1250 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1251 ena_down(adapter);
1252
1253 /* Configure queues with new size. */
1254 ena_init_io_rings_basic(adapter);
1255#ifdef DEV_NETMAP
1256 rc = ena_reinit_netmap(adapter);
1257 if (rc != 0)
1258 return rc;
1259
1260#endif /* DEV_NETMAP */
1227 if (dev_was_up) {
1228 rc = ena_up(adapter);
1229 if (unlikely(rc != 0)) {
1230 ena_log(adapter->pdev, ERR,
1231 "Failed to configure device with the new sizes - Tx: %u Rx: %u. Reverting old values - Tx: %u Rx: %u\n",
1232 new_tx_size, new_rx_size, old_tx_size, old_rx_size);
1233
1234 /* Revert old size. */
1235 adapter->requested_tx_ring_size = old_tx_size;
1236 adapter->requested_rx_ring_size = old_rx_size;
1237 ena_init_io_rings_basic(adapter);
1261 if (dev_was_up) {
1262 rc = ena_up(adapter);
1263 if (unlikely(rc != 0)) {
1264 ena_log(adapter->pdev, ERR,
1265 "Failed to configure device with the new sizes - Tx: %u Rx: %u. Reverting old values - Tx: %u Rx: %u\n",
1266 new_tx_size, new_rx_size, old_tx_size, old_rx_size);
1267
1268 /* Revert old size. */
1269 adapter->requested_tx_ring_size = old_tx_size;
1270 adapter->requested_rx_ring_size = old_rx_size;
1271 ena_init_io_rings_basic(adapter);
1272#ifdef DEV_NETMAP
1273 rc = ena_reinit_netmap(adapter);
1274 if (rc != 0)
1275 return rc;
1238
1276
1277#endif /* DEV_NETMAP */
1239 /* And try again. */
1240 rc = ena_up(adapter);
1241 if (unlikely(rc != 0)) {
1242 ena_log(adapter->pdev, ERR,
1243 "Failed to revert old queue sizes. Triggering device reset.\n");
1244 /*
1245 * If we've failed again, something had to go
1246 * wrong. After reset, the device should try to

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

1354 int rc = 0;
1355 bool dev_was_up;
1356
1357 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1358 old_num = adapter->num_io_queues;
1359 ena_down(adapter);
1360
1361 ena_update_io_rings(adapter, new_num);
1278 /* And try again. */
1279 rc = ena_up(adapter);
1280 if (unlikely(rc != 0)) {
1281 ena_log(adapter->pdev, ERR,
1282 "Failed to revert old queue sizes. Triggering device reset.\n");
1283 /*
1284 * If we've failed again, something had to go
1285 * wrong. After reset, the device should try to

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

1393 int rc = 0;
1394 bool dev_was_up;
1395
1396 dev_was_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
1397 old_num = adapter->num_io_queues;
1398 ena_down(adapter);
1399
1400 ena_update_io_rings(adapter, new_num);
1401#ifdef DEV_NETMAP
1402 rc = ena_reinit_netmap(adapter);
1403 if (rc != 0)
1404 return rc;
1362
1405
1406#endif /* DEV_NETMAP */
1363 if (dev_was_up) {
1364 rc = ena_up(adapter);
1365 if (unlikely(rc != 0)) {
1366 ena_log(adapter->pdev, ERR,
1367 "Failed to configure device with %u IO queues. "
1368 "Reverting to previous value: %u\n",
1369 new_num, old_num);
1370
1371 ena_update_io_rings(adapter, old_num);
1407 if (dev_was_up) {
1408 rc = ena_up(adapter);
1409 if (unlikely(rc != 0)) {
1410 ena_log(adapter->pdev, ERR,
1411 "Failed to configure device with %u IO queues. "
1412 "Reverting to previous value: %u\n",
1413 new_num, old_num);
1414
1415 ena_update_io_rings(adapter, old_num);
1416#ifdef DEV_NETMAP
1417 rc = ena_reinit_netmap(adapter);
1418 if (rc != 0)
1419 return rc;
1372
1420
1421#endif /* DEV_NETMAP */
1373 rc = ena_up(adapter);
1374 if (unlikely(rc != 0)) {
1375 ena_log(adapter->pdev, ERR,
1376 "Failed to revert to previous setup IO "
1377 "queues. Triggering device reset.\n");
1378 ENA_FLAG_SET_ATOMIC(
1379 ENA_FLAG_DEV_UP_BEFORE_RESET, adapter);
1380 ena_trigger_reset(adapter,

--- 2804 unchanged lines hidden ---
1422 rc = ena_up(adapter);
1423 if (unlikely(rc != 0)) {
1424 ena_log(adapter->pdev, ERR,
1425 "Failed to revert to previous setup IO "
1426 "queues. Triggering device reset.\n");
1427 ENA_FLAG_SET_ATOMIC(
1428 ENA_FLAG_DEV_UP_BEFORE_RESET, adapter);
1429 ena_trigger_reset(adapter,

--- 2804 unchanged lines hidden ---