Lines Matching defs:i40e

18  * i40e - Intel 10/40 Gb Ethernet driver
20 * The i40e driver is the main software device driver for the Intel 40 Gb family
109 * classification resources, that is a VSI in i40e.
398 i40e_dev_err(i40e_t *i40e, int level, boolean_t console, const char *fmt,
405 if (i40e == NULL) {
409 dev_err(i40e->i40e_dip, level, (console) ? "%s" : "!%s",
421 i40e_error(i40e_t *i40e, const char *fmt, ...)
426 i40e_dev_err(i40e, CE_WARN, B_FALSE, fmt, ap);
432 i40e_log(i40e_t *i40e, const char *fmt, ...)
437 i40e_dev_err(i40e, CE_NOTE, B_FALSE, fmt, ap);
443 i40e_notice(i40e_t *i40e, const char *fmt, ...)
448 i40e_dev_err(i40e, CE_NOTE, B_TRUE, fmt, ap);
453 i40e_device_rele(i40e_t *i40e)
455 i40e_device_t *idp = i40e->i40e_device;
462 list_remove(&idp->id_i40e_list, i40e);
471 i40e->i40e_device = NULL;
476 i40e_device_find(i40e_t *i40e, dev_info_t *parent, uint_t bus, uint_t device)
492 i40e_hw_t *hw = &i40e->i40e_hw_space;
509 idp->id_rsrcs_alloc = i40e->i40e_switch_rsrc_alloc;
510 idp->id_rsrcs_act = i40e->i40e_switch_rsrc_actual;
513 bcopy(i40e->i40e_switch_rsrcs, idp->id_rsrcs,
521 list_insert_tail(&idp->id_i40e_list, i40e);
528 i40e_link_state_set(i40e_t *i40e, link_state_t state)
530 if (i40e->i40e_link_state == state)
533 i40e->i40e_link_state = state;
534 mac_link_update(i40e->i40e_mac_hdl, i40e->i40e_link_state);
543 i40e_link_check(i40e_t *i40e)
545 i40e_hw_t *hw = &i40e->i40e_hw_space;
549 ASSERT(MUTEX_HELD(&i40e->i40e_general_lock));
553 i40e->i40e_s_link_status_errs++;
554 i40e->i40e_s_link_status_lasterr = ret;
568 * Translate from an i40e value to a value in Mbits/s.
572 i40e->i40e_link_speed = 100;
575 i40e->i40e_link_speed = 1000;
578 i40e->i40e_link_speed = 10000;
581 i40e->i40e_link_speed = 20000;
584 i40e->i40e_link_speed = 40000;
587 i40e->i40e_link_speed = 0;
596 i40e->i40e_link_duplex = LINK_DUPLEX_FULL;
597 i40e_link_state_set(i40e, LINK_STATE_UP);
599 i40e->i40e_link_speed = 0;
600 i40e->i40e_link_duplex = 0;
601 i40e_link_state_set(i40e, LINK_STATE_DOWN);
606 i40e_rem_intrs(i40e_t *i40e)
610 for (i = 0; i < i40e->i40e_intr_count; i++) {
611 rc = ddi_intr_free(i40e->i40e_intr_handles[i]);
613 i40e_log(i40e, "failed to free interrupt %d: %d",
618 kmem_free(i40e->i40e_intr_handles, i40e->i40e_intr_size);
619 i40e->i40e_intr_handles = NULL;
623 i40e_rem_intr_handlers(i40e_t *i40e)
627 for (i = 0; i < i40e->i40e_intr_count; i++) {
628 rc = ddi_intr_remove_handler(i40e->i40e_intr_handles[i]);
630 i40e_log(i40e, "failed to remove interrupt %d: %d",
671 i40e_fm_init(i40e_t *i40e)
675 i40e->i40e_fm_capabilities = ddi_prop_get_int(DDI_DEV_T_ANY,
676 i40e->i40e_dip, DDI_PROP_DONTPASS, "fm_capable",
680 if (i40e->i40e_fm_capabilities < 0) {
681 i40e->i40e_fm_capabilities = 0;
682 } else if (i40e->i40e_fm_capabilities > 0xf) {
683 i40e->i40e_fm_capabilities = DDI_FM_EREPORT_CAPABLE |
691 if (i40e->i40e_fm_capabilities & DDI_FM_ACCCHK_CAPABLE) {
697 if (i40e->i40e_fm_capabilities) {
698 ddi_fm_init(i40e->i40e_dip, &i40e->i40e_fm_capabilities, &iblk);
700 if (DDI_FM_EREPORT_CAP(i40e->i40e_fm_capabilities) ||
701 DDI_FM_ERRCB_CAP(i40e->i40e_fm_capabilities)) {
702 pci_ereport_setup(i40e->i40e_dip);
705 if (DDI_FM_ERRCB_CAP(i40e->i40e_fm_capabilities)) {
706 ddi_fm_handler_register(i40e->i40e_dip,
707 i40e_fm_error_cb, (void*)i40e);
711 if (i40e->i40e_fm_capabilities & DDI_FM_DMACHK_CAPABLE) {
712 i40e_init_dma_attrs(i40e, B_TRUE);
714 i40e_init_dma_attrs(i40e, B_FALSE);
719 i40e_fm_fini(i40e_t *i40e)
721 if (i40e->i40e_fm_capabilities) {
723 if (DDI_FM_EREPORT_CAP(i40e->i40e_fm_capabilities) ||
724 DDI_FM_ERRCB_CAP(i40e->i40e_fm_capabilities))
725 pci_ereport_teardown(i40e->i40e_dip);
727 if (DDI_FM_ERRCB_CAP(i40e->i40e_fm_capabilities))
728 ddi_fm_handler_unregister(i40e->i40e_dip);
730 ddi_fm_fini(i40e->i40e_dip);
735 i40e_fm_ereport(i40e_t *i40e, char *detail)
742 if (DDI_FM_EREPORT_CAP(i40e->i40e_fm_capabilities)) {
743 ddi_fm_ereport_post(i40e->i40e_dip, buf, ena, DDI_NOSLEEP,
757 i40e_get_vsi_id(i40e_t *i40e)
759 i40e_hw_t *hw = &i40e->i40e_hw_space;
770 i40e_error(i40e, "i40e_aq_get_switch_config() failed %d: %d",
776 i40e_error(i40e, "encountered multiple (%d) switching units "
792 i40e_get_hw_capabilities(i40e_t *i40e, i40e_hw_t *hw)
812 i40e_error(i40e, "Capability discovery failed "
820 i40e_error(i40e, "Capability discovery failed: %d", rc);
835 i40e_get_switch_resources(i40e_t *i40e)
837 i40e_hw_t *hw = &i40e->i40e_hw_space;
860 i40e_error(i40e,
868 i40e->i40e_switch_rsrc_alloc = cnt;
869 i40e->i40e_switch_rsrc_actual = act;
870 i40e->i40e_switch_rsrcs = buf;
876 i40e_cleanup_resources(i40e_t *i40e)
878 if (i40e->i40e_uaddrs != NULL) {
879 kmem_free(i40e->i40e_uaddrs, sizeof (i40e_uaddr_t) *
880 i40e->i40e_resources.ifr_nmacfilt);
881 i40e->i40e_uaddrs = NULL;
884 if (i40e->i40e_maddrs != NULL) {
885 kmem_free(i40e->i40e_maddrs, sizeof (i40e_maddr_t) *
886 i40e->i40e_resources.ifr_nmcastfilt);
887 i40e->i40e_maddrs = NULL;
890 if (i40e->i40e_switch_rsrcs != NULL) {
892 i40e->i40e_switch_rsrc_alloc;
894 kmem_free(i40e->i40e_switch_rsrcs, sz);
895 i40e->i40e_switch_rsrcs = NULL;
898 if (i40e->i40e_device != NULL)
899 i40e_device_rele(i40e);
903 i40e_get_available_resources(i40e_t *i40e)
910 i40e_hw_t *hw = &i40e->i40e_hw_space;
912 parent = ddi_get_parent(i40e->i40e_dip);
914 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, i40e->i40e_dip, 0, "reg",
929 i40e->i40e_hw_space.bus.func = func;
930 i40e->i40e_hw_space.bus.device = device;
932 if (i40e_get_switch_resources(i40e) == B_FALSE) {
949 idp = i40e_device_find(i40e, parent, bus, device);
950 i40e->i40e_device = idp;
951 i40e->i40e_resources.ifr_nvsis = 0;
952 i40e->i40e_resources.ifr_nvsis_used = 0;
953 i40e->i40e_resources.ifr_nmacfilt = 0;
954 i40e->i40e_resources.ifr_nmacfilt_used = 0;
955 i40e->i40e_resources.ifr_nmcastfilt = 0;
956 i40e->i40e_resources.ifr_nmcastfilt_used = 0;
958 for (i = 0; i < i40e->i40e_switch_rsrc_actual; i++) {
959 i40e_switch_rsrc_t *srp = &i40e->i40e_switch_rsrcs[i];
963 i40e->i40e_resources.ifr_nvsis +=
965 i40e->i40e_resources.ifr_nvsis_used = LE_16(srp->used);
968 i40e->i40e_resources.ifr_nmacfilt +=
970 i40e->i40e_resources.ifr_nmacfilt_used =
974 i40e->i40e_resources.ifr_nmcastfilt +=
976 i40e->i40e_resources.ifr_nmcastfilt_used =
985 i40e_switch_rsrc_t *srp = &i40e->i40e_switch_rsrcs[i];
988 i40e->i40e_resources.ifr_nvsis +=
992 i40e->i40e_resources.ifr_nmacfilt +=
996 i40e->i40e_resources.ifr_nmcastfilt +=
1003 i40e->i40e_resources.ifr_nrx_queue = hw->func_caps.num_rx_qp;
1004 i40e->i40e_resources.ifr_ntx_queue = hw->func_caps.num_tx_qp;
1006 i40e->i40e_uaddrs = kmem_zalloc(sizeof (i40e_uaddr_t) *
1007 i40e->i40e_resources.ifr_nmacfilt, KM_SLEEP);
1008 i40e->i40e_maddrs = kmem_zalloc(sizeof (i40e_maddr_t) *
1009 i40e->i40e_resources.ifr_nmcastfilt, KM_SLEEP);
1015 for (i = 0; i < i40e->i40e_resources.ifr_nmacfilt; i++)
1016 i40e->i40e_uaddrs[i].iua_mac[0] = 0x01;
1022 i40e_enable_interrupts(i40e_t *i40e)
1026 if (i40e->i40e_intr_cap & DDI_INTR_FLAG_BLOCK) {
1027 rc = ddi_intr_block_enable(i40e->i40e_intr_handles,
1028 i40e->i40e_intr_count);
1030 i40e_error(i40e, "Interrupt block-enable failed: %d",
1035 for (i = 0; i < i40e->i40e_intr_count; i++) {
1036 rc = ddi_intr_enable(i40e->i40e_intr_handles[i]);
1038 i40e_error(i40e,
1042 i40e->i40e_intr_handles[i]);
1053 i40e_disable_interrupts(i40e_t *i40e)
1057 if (i40e->i40e_intr_cap & DDI_INTR_FLAG_BLOCK) {
1058 rc = ddi_intr_block_disable(i40e->i40e_intr_handles,
1059 i40e->i40e_intr_count);
1061 i40e_error(i40e,
1066 for (i = 0; i < i40e->i40e_intr_count; i++) {
1067 rc = ddi_intr_disable(i40e->i40e_intr_handles[i]);
1069 i40e_error(i40e,
1084 i40e_free_trqpairs(i40e_t *i40e)
1089 if (i40e->i40e_trqpairs != NULL) {
1090 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
1091 itrq = &i40e->i40e_trqpairs[i];
1104 kmem_free(i40e->i40e_trqpairs,
1105 sizeof (i40e_trqpair_t) * i40e->i40e_num_trqpairs);
1106 i40e->i40e_trqpairs = NULL;
1109 cv_destroy(&i40e->i40e_rx_pending_cv);
1110 mutex_destroy(&i40e->i40e_rx_pending_lock);
1111 mutex_destroy(&i40e->i40e_general_lock);
1119 i40e_alloc_trqpairs(i40e_t *i40e)
1122 void *mutexpri = DDI_INTR_PRI(i40e->i40e_intr_pri);
1128 mutex_init(&i40e->i40e_general_lock, NULL, MUTEX_DRIVER, mutexpri);
1129 mutex_init(&i40e->i40e_rx_pending_lock, NULL, MUTEX_DRIVER, mutexpri);
1130 cv_init(&i40e->i40e_rx_pending_cv, NULL, CV_DRIVER, NULL);
1132 i40e->i40e_trqpairs = kmem_zalloc(sizeof (i40e_trqpair_t) *
1133 i40e->i40e_num_trqpairs, KM_SLEEP);
1134 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
1135 i40e_trqpair_t *itrq = &i40e->i40e_trqpairs[i];
1137 itrq->itrq_i40e = i40e;
1158 i40e_hw_to_instance(i40e_t *i40e, i40e_hw_t *hw)
1160 if (i40e->i40e_num_trqpairs == 0) {
1161 i40e->i40e_num_trqpairs = I40E_TRQPAIR_MAX;
1164 if (i40e->i40e_num_rx_groups == 0) {
1165 i40e->i40e_num_rx_groups = I40E_GROUP_MAX;
1173 i40e_common_code_fini(i40e_t *i40e)
1175 i40e_hw_t *hw = &i40e->i40e_hw_space;
1180 i40e_error(i40e, "failed to shutdown LAN hmc: %d", rc);
1184 i40e_error(i40e, "failed to shutdown admin queue: %d", rc);
1193 i40e_common_code_init(i40e_t *i40e, i40e_hw_t *hw)
1200 i40e_error(i40e, "failed to reset hardware: %d", rc);
1201 i40e_fm_ereport(i40e, DDI_FM_DEVICE_NO_RESPONSE);
1207 i40e_error(i40e, "failed to initialize i40e core: %d", rc);
1218 i40e_error(i40e, "failed to initialize firmware admin queue: "
1220 i40e_fm_ereport(i40e, DDI_FM_DEVICE_INVAL_STATE);
1226 i40e_notice(i40e, "The driver for the device detected a newer "
1233 i40e_notice(i40e, "The driver for the device detected an older"
1246 if (!i40e_get_hw_capabilities(i40e, hw)) {
1247 i40e_error(i40e, "failed to obtain hardware capabilities");
1251 if (i40e_get_available_resources(i40e) == B_FALSE) {
1252 i40e_error(i40e, "failed to obtain hardware resources");
1256 i40e_hw_to_instance(i40e, hw);
1261 i40e_error(i40e, "failed to initialize hardware memory cache: "
1268 i40e_error(i40e, "failed to configure hardware memory cache: "
1277 i40e_error(i40e, "failed to retrieve hardware mac address: %d",
1284 i40e_error(i40e, "failed to validate internal mac address: "
1291 i40e_error(i40e, "failed to retrieve port mac address: %d",
1300 i40e->i40e_vsi_id = i40e_get_vsi_id(i40e);
1301 if (i40e->i40e_vsi_id == -1) {
1302 i40e_error(i40e, "failed to obtain VSI ID");
1310 i40e_unconfigure(dev_info_t *devinfo, i40e_t *i40e)
1314 if (i40e->i40e_attach_progress & I40E_ATTACH_ENABLE_INTR)
1315 (void) i40e_disable_interrupts(i40e);
1317 if ((i40e->i40e_attach_progress & I40E_ATTACH_LINK_TIMER) &&
1318 i40e->i40e_periodic_id != 0) {
1319 ddi_periodic_delete(i40e->i40e_periodic_id);
1320 i40e->i40e_periodic_id = 0;
1323 if (i40e->i40e_attach_progress & I40E_ATTACH_MAC) {
1324 rc = mac_unregister(i40e->i40e_mac_hdl);
1326 i40e_error(i40e, "failed to unregister from mac: %d",
1331 if (i40e->i40e_attach_progress & I40E_ATTACH_STATS) {
1332 i40e_stats_fini(i40e);
1335 if (i40e->i40e_attach_progress & I40E_ATTACH_ADD_INTR)
1336 i40e_rem_intr_handlers(i40e);
1338 if (i40e->i40e_attach_progress & I40E_ATTACH_ALLOC_RINGSLOCKS)
1339 i40e_free_trqpairs(i40e);
1341 if (i40e->i40e_attach_progress & I40E_ATTACH_ALLOC_INTR)
1342 i40e_rem_intrs(i40e);
1344 if (i40e->i40e_attach_progress & I40E_ATTACH_COMMON_CODE)
1345 i40e_common_code_fini(i40e);
1347 i40e_cleanup_resources(i40e);
1349 if (i40e->i40e_attach_progress & I40E_ATTACH_PROPS)
1352 if (i40e->i40e_attach_progress & I40E_ATTACH_REGS_MAP &&
1353 i40e->i40e_osdep_space.ios_reg_handle != NULL) {
1354 ddi_regs_map_free(&i40e->i40e_osdep_space.ios_reg_handle);
1355 i40e->i40e_osdep_space.ios_reg_handle = NULL;
1358 if ((i40e->i40e_attach_progress & I40E_ATTACH_PCI_CONFIG) &&
1359 i40e->i40e_osdep_space.ios_cfg_handle != NULL) {
1360 pci_config_teardown(&i40e->i40e_osdep_space.ios_cfg_handle);
1361 i40e->i40e_osdep_space.ios_cfg_handle = NULL;
1364 if (i40e->i40e_attach_progress & I40E_ATTACH_FM_INIT)
1365 i40e_fm_fini(i40e);
1367 kmem_free(i40e->i40e_aqbuf, I40E_ADMINQ_BUFSZ);
1368 kmem_free(i40e, sizeof (i40e_t));
1374 i40e_final_init(i40e_t *i40e)
1376 i40e_hw_t *hw = &i40e->i40e_hw_space;
1385 i40e_log(i40e, "failed to read PBA string: %d", irc);
1387 (void) ddi_prop_update_string(DDI_DEV_T_NONE, i40e->i40e_dip,
1401 (void) ddi_prop_update_string(DDI_DEV_T_NONE, i40e->i40e_dip,
1404 (void) ddi_prop_update_string(DDI_DEV_T_NONE, i40e->i40e_dip,
1408 (void) ddi_prop_update_string(DDI_DEV_T_NONE, i40e->i40e_dip,
1415 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_LOST);
1423 i40e_identify_hardware(i40e_t *i40e)
1425 i40e_hw_t *hw = &i40e->i40e_hw_space;
1426 struct i40e_osdep *osdep = &i40e->i40e_osdep_space;
1452 i40e_regs_map(i40e_t *i40e)
1454 dev_info_t *devinfo = i40e->i40e_dip;
1455 i40e_hw_t *hw = &i40e->i40e_hw_space;
1456 struct i40e_osdep *osdep = &i40e->i40e_osdep_space;
1462 i40e_error(i40e, "Used invalid register set to map PCIe regs");
1469 i40e_error(i40e, "failed to map device registers: %d", ret);
1483 i40e_update_mtu(i40e_t *i40e)
1487 i40e->i40e_frame_max = i40e->i40e_sdu +
1490 rx = i40e->i40e_frame_max + I40E_BUF_IPHDR_ALIGNMENT;
1491 i40e->i40e_rx_buf_size = ((rx >> 10) +
1494 tx = i40e->i40e_frame_max;
1495 i40e->i40e_tx_buf_size = ((tx >> 10) +
1500 i40e_get_prop(i40e_t *i40e, char *prop, int min, int max, int def)
1504 val = ddi_prop_get_int(DDI_DEV_T_ANY, i40e->i40e_dip, DDI_PROP_DONTPASS,
1514 i40e_init_properties(i40e_t *i40e)
1516 i40e->i40e_sdu = i40e_get_prop(i40e, "default_mtu",
1519 i40e->i40e_intr_force = i40e_get_prop(i40e, "intr_force",
1522 i40e->i40e_mr_enable = i40e_get_prop(i40e, "mr_enable",
1525 i40e->i40e_tx_ring_size = i40e_get_prop(i40e, "tx_ring_size",
1528 if ((i40e->i40e_tx_ring_size % I40E_DESC_ALIGN) != 0) {
1529 i40e->i40e_tx_ring_size = P2ROUNDUP(i40e->i40e_tx_ring_size,
1533 i40e->i40e_tx_block_thresh = i40e_get_prop(i40e, "tx_resched_threshold",
1535 i40e->i40e_tx_ring_size - I40E_TX_MAX_COOKIE,
1538 i40e->i40e_rx_ring_size = i40e_get_prop(i40e, "rx_ring_size",
1541 if ((i40e->i40e_rx_ring_size % I40E_DESC_ALIGN) != 0) {
1542 i40e->i40e_rx_ring_size = P2ROUNDUP(i40e->i40e_rx_ring_size,
1546 i40e->i40e_rx_limit_per_intr = i40e_get_prop(i40e, "rx_limit_per_intr",
1550 i40e->i40e_tx_hcksum_enable = i40e_get_prop(i40e, "tx_hcksum_enable",
1553 i40e->i40e_rx_hcksum_enable = i40e_get_prop(i40e, "rx_hcksum_enable",
1556 i40e->i40e_rx_dma_min = i40e_get_prop(i40e, "rx_dma_threshold",
1560 i40e->i40e_tx_dma_min = i40e_get_prop(i40e, "tx_dma_threshold",
1564 i40e->i40e_tx_itr = i40e_get_prop(i40e, "tx_intr_throttle",
1567 i40e->i40e_rx_itr = i40e_get_prop(i40e, "rx_intr_throttle",
1570 i40e->i40e_other_itr = i40e_get_prop(i40e, "other_intr_throttle",
1573 if (!i40e->i40e_mr_enable) {
1574 i40e->i40e_num_trqpairs = I40E_TRQPAIR_NOMSIX;
1575 i40e->i40e_num_rx_groups = I40E_GROUP_NOMSIX;
1578 i40e_update_mtu(i40e);
1595 i40e_alloc_intr_handles(i40e_t *i40e, dev_info_t *devinfo, int intr_type)
1613 ASSERT(i40e->i40e_num_trqpairs == 1);
1625 i40e_log(i40e, "Get interrupt number failed, "
1632 i40e_log(i40e, "Get AVAILABLE interrupt number failed, "
1638 i40e->i40e_intr_count = 0;
1639 i40e->i40e_intr_count_max = 0;
1640 i40e->i40e_intr_count_min = 0;
1642 i40e->i40e_intr_size = request * sizeof (ddi_intr_handle_t);
1643 ASSERT(i40e->i40e_intr_size != 0);
1644 i40e->i40e_intr_handles = kmem_alloc(i40e->i40e_intr_size, KM_SLEEP);
1646 rc = ddi_intr_alloc(devinfo, i40e->i40e_intr_handles, intr_type, 0,
1649 i40e_log(i40e, "Interrupt allocation failed with %d.", rc);
1653 i40e->i40e_intr_count = actual;
1654 i40e->i40e_intr_count_max = request;
1655 i40e->i40e_intr_count_min = min;
1658 i40e_log(i40e, "actual (%d) is less than minimum (%d).",
1668 rc = ddi_intr_get_pri(i40e->i40e_intr_handles[0], &i40e->i40e_intr_pri);
1670 i40e_log(i40e,
1675 rc = ddi_intr_get_cap(i40e->i40e_intr_handles[0], &i40e->i40e_intr_cap);
1677 i40e_log(i40e,
1682 i40e->i40e_intr_type = intr_type;
1687 i40e_rem_intrs(i40e);
1692 i40e_alloc_intrs(i40e_t *i40e, dev_info_t *devinfo)
1698 i40e_error(i40e, "failed to get supported interrupt types: %d",
1703 i40e->i40e_intr_type = 0;
1706 i40e->i40e_intr_force <= I40E_INTR_MSIX) {
1707 if (i40e_alloc_intr_handles(i40e, devinfo, DDI_INTR_TYPE_MSIX))
1716 i40e->i40e_num_trqpairs = I40E_TRQPAIR_NOMSIX;
1717 i40e->i40e_num_rx_groups = I40E_GROUP_NOMSIX;
1720 (i40e->i40e_intr_force <= I40E_INTR_MSI)) {
1721 if (i40e_alloc_intr_handles(i40e, devinfo, DDI_INTR_TYPE_MSI))
1726 if (i40e_alloc_intr_handles(i40e, devinfo, DDI_INTR_TYPE_FIXED))
1737 i40e_map_intrs_to_vectors(i40e_t *i40e)
1739 if (i40e->i40e_intr_type != DDI_INTR_TYPE_MSIX) {
1751 ASSERT(i40e->i40e_intr_count == 2);
1752 ASSERT(i40e->i40e_num_trqpairs == 1);
1754 i40e->i40e_trqpairs[0].itrq_rx_intrvec = 1;
1755 i40e->i40e_trqpairs[0].itrq_tx_intrvec = 1;
1761 i40e_add_intr_handlers(i40e_t *i40e)
1765 switch (i40e->i40e_intr_type) {
1767 for (vector = 0; vector < i40e->i40e_intr_count; vector++) {
1769 i40e->i40e_intr_handles[vector],
1770 (ddi_intr_handler_t *)i40e_intr_msix, i40e,
1773 i40e_log(i40e, "Add interrupt handler (MSI-X) "
1777 i40e->i40e_intr_handles[vector]);
1784 rc = ddi_intr_add_handler(i40e->i40e_intr_handles[0],
1785 (ddi_intr_handler_t *)i40e_intr_msi, i40e, NULL);
1787 i40e_log(i40e, "Add interrupt handler (MSI) failed: "
1793 rc = ddi_intr_add_handler(i40e->i40e_intr_handles[0],
1794 (ddi_intr_handler_t *)i40e_intr_legacy, i40e, NULL);
1796 i40e_log(i40e, "Add interrupt handler (legacy) failed:"
1804 (void *)i40e, i40e->i40e_intr_type);
1822 i40e_t *i40e = arg;
1824 mutex_enter(&i40e->i40e_general_lock);
1825 i40e_link_check(i40e);
1826 mutex_exit(&i40e->i40e_general_lock);
1833 i40e_get_hw_state(i40e_t *i40e, i40e_hw_t *hw)
1837 ASSERT(MUTEX_HELD(&i40e->i40e_general_lock));
1840 i40e_link_check(i40e);
1846 rc = i40e_aq_get_phy_capabilities(hw, B_FALSE, B_TRUE, &i40e->i40e_phy,
1851 &i40e->i40e_phy, NULL);
1856 i40e_error(i40e, "encountered unknown PHY type, "
1859 i40e_error(i40e, "error getting physical capabilities: "
1866 i40e_error(i40e, "failed to update link information: %d", rc);
1875 i40e_error(i40e, "failed to update phy link mask: %d", rc);
1888 i40e_init_macaddrs(i40e_t *i40e, i40e_hw_t *hw)
1898 i40e_config_vsi(i40e_t *i40e, i40e_hw_t *hw)
1904 context.seid = i40e->i40e_vsi_id;
1908 i40e_error(i40e, "get VSI params failed with %d", err);
1926 i40e->i40e_vsi_stat_id = LE16_TO_CPU(context.info.stat_counter_idx);
1927 if (i40e_stat_vsi_init(i40e) == B_FALSE)
1932 i40e_error(i40e, "Update VSI params failed with %d", err);
1944 i40e_chip_start(i40e_t *i40e)
1946 i40e_hw_t *hw = &i40e->i40e_hw_space;
1955 i40e_error(i40e, "failed to restart link: admin queue "
1962 i40e_get_hw_state(i40e, hw);
1965 i40e_init_macaddrs(i40e, hw);
1976 i40e_error(i40e, "i40e_set_filter_control() returned %d", rc);
1980 i40e_intr_chip_init(i40e);
1982 if (!i40e_config_vsi(i40e, hw))
1994 i40e_shutdown_rx_rings(i40e_t *i40e)
1999 i40e_hw_t *hw = &i40e->i40e_hw_space;
2007 if (i40e->i40e_intr_type == DDI_INTR_TYPE_MSIX) {
2008 for (i = 1; i < i40e->i40e_intr_count; i++) {
2019 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2044 i40e_shutdown_tx_rings(i40e_t *i40e)
2049 i40e_hw_t *hw = &i40e->i40e_hw_space;
2055 if (i40e->i40e_intr_type == DDI_INTR_TYPE_MSIX) {
2056 for (i = 1; i < i40e->i40e_intr_count; i++) {
2067 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2079 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2105 i40e_shutdown_rings_wait(i40e_t *i40e)
2108 i40e_hw_t *hw = &i40e->i40e_hw_space;
2110 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2121 i40e_error(i40e, "timed out disabling rx queue %d",
2134 i40e_error(i40e, "timed out disabling tx queue %d",
2144 i40e_shutdown_rings(i40e_t *i40e)
2146 i40e_shutdown_rx_rings(i40e);
2147 i40e_shutdown_tx_rings(i40e);
2148 return (i40e_shutdown_rings_wait(i40e));
2174 i40e_t *i40e = itrq->itrq_i40e;
2175 i40e_hw_t *hw = &i40e->i40e_hw_space;
2184 VERIFY(i40e->i40e_rx_buf_size >= I40E_HMC_RX_DBUFF_MIN);
2185 VERIFY(i40e->i40e_rx_buf_size <= I40E_HMC_RX_DBUFF_MAX);
2186 rctx.dbuff = i40e->i40e_rx_buf_size >> I40E_RXQ_CTX_DBUFF_SHIFT;
2196 rctx.rxmax = i40e->i40e_frame_max;
2210 i40e_error(i40e, "failed to clear rx queue %d context: %d",
2217 i40e_error(i40e, "failed to set rx queue %d context: %d",
2231 i40e_setup_rx_rings(i40e_t *i40e)
2234 i40e_hw_t *hw = &i40e->i40e_hw_space;
2236 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2237 i40e_trqpair_t *itrq = &i40e->i40e_trqpairs[i];
2273 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2290 i40e_error(i40e, "failed to enable rx queue %d, timed "
2302 i40e_t *i40e = itrq->itrq_i40e;
2303 i40e_hw_t *hw = &i40e->i40e_hw_space;
2340 context.seid = i40e->i40e_vsi_id;
2344 i40e_error(i40e, "get VSI params failed with %d", err);
2351 i40e_error(i40e, "failed to clear tx queue %d context: %d",
2358 i40e_error(i40e, "failed to set tx queue %d context: %d",
2371 i40e_setup_tx_rings(i40e_t *i40e)
2374 i40e_hw_t *hw = &i40e->i40e_hw_space;
2376 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2377 i40e_trqpair_t *itrq = &i40e->i40e_trqpairs[i];
2415 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2432 i40e_error(i40e, "failed to enable tx queue %d, timed "
2442 i40e_stop(i40e_t *i40e, boolean_t free_allocations)
2446 ASSERT(MUTEX_HELD(&i40e->i40e_general_lock));
2471 i40e_intr_io_disable_all(i40e);
2472 i40e_intr_io_clear_cause(i40e);
2474 if (i40e_shutdown_rings(i40e) == B_FALSE) {
2475 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_LOST);
2480 i40e_intr_chip_fini(i40e);
2482 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2483 mutex_enter(&i40e->i40e_trqpairs[i].itrq_rx_lock);
2484 mutex_enter(&i40e->i40e_trqpairs[i].itrq_tx_lock);
2491 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2492 i40e_stats_trqpair_fini(&i40e->i40e_trqpairs[i]);
2495 if (i40e_check_acc_handle(i40e->i40e_osdep_space.ios_cfg_handle) !=
2497 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_LOST);
2500 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2501 i40e_tx_cleanup_ring(&i40e->i40e_trqpairs[i]);
2504 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2505 mutex_exit(&i40e->i40e_trqpairs[i].itrq_rx_lock);
2506 mutex_exit(&i40e->i40e_trqpairs[i].itrq_tx_lock);
2509 i40e_stat_vsi_fini(i40e);
2511 i40e->i40e_link_speed = 0;
2512 i40e->i40e_link_duplex = 0;
2513 i40e_link_state_set(i40e, LINK_STATE_UNKNOWN);
2516 i40e_free_ring_mem(i40e, B_FALSE);
2521 i40e_start(i40e_t *i40e, boolean_t alloc)
2523 i40e_hw_t *hw = &i40e->i40e_hw_space;
2527 ASSERT(MUTEX_HELD(&i40e->i40e_general_lock));
2530 if (i40e_alloc_ring_mem(i40e) == B_FALSE) {
2531 i40e_error(i40e,
2541 for (i = 0; i < i40e->i40e_num_trqpairs; i++) {
2542 if (i40e_stats_trqpair_init(&i40e->i40e_trqpairs[i]) ==
2547 i40e_trqpair_t *itrq = &i40e->i40e_trqpairs[j];
2554 if (!i40e_chip_start(i40e)) {
2555 i40e_fm_ereport(i40e, DDI_FM_DEVICE_INVAL_STATE);
2560 if (i40e_setup_rx_rings(i40e) == B_FALSE) {
2565 if (i40e_setup_tx_rings(i40e) == B_FALSE) {
2574 err = i40e_aq_set_vsi_broadcast(hw, i40e->i40e_vsi_id, B_TRUE, NULL);
2576 i40e_error(i40e, "failed to set default VSI: %d", err);
2581 err = i40e_aq_set_mac_config(hw, i40e->i40e_frame_max, B_TRUE, 0, NULL);
2583 i40e_error(i40e, "failed to set MAC config: %d", err);
2591 if (i40e_check_acc_handle(i40e->i40e_osdep_space.ios_reg_handle) !=
2598 atomic_and_32(&i40e->i40e_state,
2601 i40e_intr_io_enable_all(i40e);
2605 i40e_stop(i40e, B_FALSE);
2607 i40e_free_ring_mem(i40e, B_TRUE);
2609 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_LOST);
2620 i40e_drain_rx(i40e_t *i40e)
2622 mutex_enter(&i40e->i40e_rx_pending_lock);
2623 while (i40e->i40e_rx_pending > 0) {
2624 if (cv_reltimedwait(&i40e->i40e_rx_pending_cv,
2625 &i40e->i40e_rx_pending_lock,
2627 mutex_exit(&i40e->i40e_rx_pending_lock);
2631 mutex_exit(&i40e->i40e_rx_pending_lock);
2639 i40e_t *i40e;
2648 i40e = kmem_zalloc(sizeof (i40e_t), KM_SLEEP);
2650 i40e->i40e_aqbuf = kmem_zalloc(I40E_ADMINQ_BUFSZ, KM_SLEEP);
2651 i40e->i40e_instance = instance;
2652 i40e->i40e_dip = devinfo;
2654 hw = &i40e->i40e_hw_space;
2655 osdep = &i40e->i40e_osdep_space;
2657 osdep->ios_i40e = i40e;
2659 ddi_set_driver_private(devinfo, i40e);
2661 i40e_fm_init(i40e);
2662 i40e->i40e_attach_progress |= I40E_ATTACH_FM_INIT;
2665 i40e_error(i40e, "Failed to map PCI configurations.");
2668 i40e->i40e_attach_progress |= I40E_ATTACH_PCI_CONFIG;
2670 if (!i40e_identify_hardware(i40e)) {
2671 i40e_error(i40e, "Failed to identify hardware");
2675 if (!i40e_regs_map(i40e)) {
2676 i40e_error(i40e, "Failed to map device registers.");
2679 i40e->i40e_attach_progress |= I40E_ATTACH_REGS_MAP;
2681 i40e_init_properties(i40e);
2682 i40e->i40e_attach_progress |= I40E_ATTACH_PROPS;
2684 if (!i40e_common_code_init(i40e, hw))
2686 i40e->i40e_attach_progress |= I40E_ATTACH_COMMON_CODE;
2692 if (!i40e_alloc_intrs(i40e, devinfo)) {
2693 i40e_error(i40e, "Failed to allocate interrupts.");
2696 i40e->i40e_attach_progress |= I40E_ATTACH_ALLOC_INTR;
2698 if (!i40e_alloc_trqpairs(i40e)) {
2699 i40e_error(i40e,
2703 i40e->i40e_attach_progress |= I40E_ATTACH_ALLOC_RINGSLOCKS;
2705 if (!i40e_map_intrs_to_vectors(i40e)) {
2706 i40e_error(i40e, "Failed to map interrupts to vectors.");
2710 if (!i40e_add_intr_handlers(i40e)) {
2711 i40e_error(i40e, "Failed to add the interrupt handlers.");
2714 i40e->i40e_attach_progress |= I40E_ATTACH_ADD_INTR;
2716 if (!i40e_final_init(i40e)) {
2717 i40e_error(i40e, "Final initialization failed.");
2720 i40e->i40e_attach_progress |= I40E_ATTACH_INIT;
2722 if (i40e_check_acc_handle(i40e->i40e_osdep_space.ios_cfg_handle) !=
2724 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_LOST);
2728 if (!i40e_stats_init(i40e)) {
2729 i40e_error(i40e, "Stats initialization failed.");
2732 i40e->i40e_attach_progress |= I40E_ATTACH_STATS;
2734 if (!i40e_register_mac(i40e)) {
2735 i40e_error(i40e, "Failed to register to MAC/GLDv3");
2738 i40e->i40e_attach_progress |= I40E_ATTACH_MAC;
2740 i40e->i40e_periodic_id = ddi_periodic_add(i40e_timer, i40e,
2742 if (i40e->i40e_periodic_id == 0) {
2743 i40e_error(i40e, "Failed to add the link-check timer");
2746 i40e->i40e_attach_progress |= I40E_ATTACH_LINK_TIMER;
2748 if (!i40e_enable_interrupts(i40e)) {
2749 i40e_error(i40e, "Failed to enable DDI interrupts");
2752 i40e->i40e_attach_progress |= I40E_ATTACH_ENABLE_INTR;
2754 atomic_or_32(&i40e->i40e_state, I40E_INITIALIZED);
2757 list_insert_tail(&i40e_glist, i40e);
2763 i40e_unconfigure(devinfo, i40e);
2770 i40e_t *i40e;
2775 i40e = (i40e_t *)ddi_get_driver_private(devinfo);
2776 if (i40e == NULL) {
2777 i40e_log(NULL, "i40e_detach() called with no i40e pointer!");
2781 if (i40e_drain_rx(i40e) == B_FALSE) {
2782 i40e_log(i40e, "timed out draining DMA resources, %d buffers "
2783 "remain", i40e->i40e_rx_pending);
2788 list_remove(&i40e_glist, i40e);
2791 i40e_unconfigure(devinfo, i40e);