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