Lines Matching refs:dp

93 #define	DEFAULT_PIPE(dp)	((dp)->reg_data->dev_default_ph)  argument
103 #define MAXPKTLEN(dp) ((dp)->mtu + ETHERHEADERL) argument
104 #define MAXPKTBUF(dp) ((dp)->mtu + ETHERHEADERL + ETHERFCSL) argument
113 static int usbgem_open_pipes(struct usbgem_dev *dp);
114 static int usbgem_close_pipes(struct usbgem_dev *dp);
238 usbgem_prop_get_int(struct usbgem_dev *dp, char *prop_template, int def_val) in usbgem_prop_get_int() argument
242 (void) sprintf(propname, prop_template, dp->name); in usbgem_prop_get_int()
244 return (ddi_prop_get_int(DDI_DEV_T_ANY, dp->dip, in usbgem_prop_get_int()
277 usbgem_hal_reset_chip(struct usbgem_dev *dp) in usbgem_hal_reset_chip() argument
281 sema_p(&dp->hal_op_lock); in usbgem_hal_reset_chip()
282 err = (*dp->ugc.usbgc_reset_chip)(dp); in usbgem_hal_reset_chip()
283 sema_v(&dp->hal_op_lock); in usbgem_hal_reset_chip()
288 usbgem_hal_init_chip(struct usbgem_dev *dp) in usbgem_hal_init_chip() argument
292 sema_p(&dp->hal_op_lock); in usbgem_hal_init_chip()
293 err = (*dp->ugc.usbgc_init_chip)(dp); in usbgem_hal_init_chip()
294 sema_v(&dp->hal_op_lock); in usbgem_hal_init_chip()
299 usbgem_hal_attach_chip(struct usbgem_dev *dp) in usbgem_hal_attach_chip() argument
303 sema_p(&dp->hal_op_lock); in usbgem_hal_attach_chip()
304 err = (*dp->ugc.usbgc_attach_chip)(dp); in usbgem_hal_attach_chip()
305 sema_v(&dp->hal_op_lock); in usbgem_hal_attach_chip()
310 usbgem_hal_set_rx_filter(struct usbgem_dev *dp) in usbgem_hal_set_rx_filter() argument
314 sema_p(&dp->hal_op_lock); in usbgem_hal_set_rx_filter()
315 err = (*dp->ugc.usbgc_set_rx_filter)(dp); in usbgem_hal_set_rx_filter()
316 sema_v(&dp->hal_op_lock); in usbgem_hal_set_rx_filter()
321 usbgem_hal_set_media(struct usbgem_dev *dp) in usbgem_hal_set_media() argument
325 sema_p(&dp->hal_op_lock); in usbgem_hal_set_media()
326 err = (*dp->ugc.usbgc_set_media)(dp); in usbgem_hal_set_media()
327 sema_v(&dp->hal_op_lock); in usbgem_hal_set_media()
332 usbgem_hal_start_chip(struct usbgem_dev *dp) in usbgem_hal_start_chip() argument
336 sema_p(&dp->hal_op_lock); in usbgem_hal_start_chip()
337 err = (*dp->ugc.usbgc_start_chip)(dp); in usbgem_hal_start_chip()
338 sema_v(&dp->hal_op_lock); in usbgem_hal_start_chip()
343 usbgem_hal_stop_chip(struct usbgem_dev *dp) in usbgem_hal_stop_chip() argument
347 sema_p(&dp->hal_op_lock); in usbgem_hal_stop_chip()
348 err = (*dp->ugc.usbgc_stop_chip)(dp); in usbgem_hal_stop_chip()
349 sema_v(&dp->hal_op_lock); in usbgem_hal_stop_chip()
354 usbgem_hal_get_stats(struct usbgem_dev *dp) in usbgem_hal_get_stats() argument
358 sema_p(&dp->hal_op_lock); in usbgem_hal_get_stats()
359 err = (*dp->ugc.usbgc_get_stats)(dp); in usbgem_hal_get_stats()
360 sema_v(&dp->hal_op_lock); in usbgem_hal_get_stats()
371 usbgem_rx_start_unit(struct usbgem_dev *dp, usb_bulk_req_t *req) in usbgem_rx_start_unit() argument
379 mp = allocb(dp->rx_buf_len, BPRI_MED); in usbgem_rx_start_unit()
382 dp->name, __func__); in usbgem_rx_start_unit()
386 req->bulk_len = dp->rx_buf_len; in usbgem_rx_start_unit()
388 req->bulk_client_private = (usb_opaque_t)dp; in usbgem_rx_start_unit()
397 err = usb_pipe_bulk_xfer(dp->bulkin_pipe, req, flags); in usbgem_rx_start_unit()
401 dp->name, err); in usbgem_rx_start_unit()
418 usbgem_init_rx_buf(struct usbgem_dev *dp) in usbgem_init_rx_buf() argument
423 ASSERT(dp->mac_state == MAC_STATE_ONLINE); in usbgem_init_rx_buf()
425 for (i = 0; i < dp->ugc.usbgc_rx_list_max; i++) { in usbgem_init_rx_buf()
426 req = usb_alloc_bulk_req(dp->dip, 0, USB_FLAGS_SLEEP); in usbgem_init_rx_buf()
430 dp->name, __func__); in usbgem_init_rx_buf()
433 if (!usbgem_rx_start_unit(dp, req)) { in usbgem_init_rx_buf()
436 mutex_enter(&dp->rxlock); in usbgem_init_rx_buf()
437 dp->rx_busy_cnt++; in usbgem_init_rx_buf()
438 mutex_exit(&dp->rxlock); in usbgem_init_rx_buf()
449 usbgem_free_memory(struct usbgem_dev *dp) in usbgem_free_memory() argument
454 while ((req = dp->tx_free_list) != NULL) { in usbgem_free_memory()
455 dp->tx_free_list = in usbgem_free_memory()
464 usbgem_alloc_memory(struct usbgem_dev *dp) in usbgem_alloc_memory() argument
470 dp->tx_free_list = NULL; in usbgem_alloc_memory()
471 for (i = 0; i < dp->ugc.usbgc_tx_list_max; i++) { in usbgem_alloc_memory()
472 req = usb_alloc_bulk_req(dp->dip, 0, USB_FLAGS_SLEEP); in usbgem_alloc_memory()
476 dp->name, __func__); in usbgem_alloc_memory()
479 (void) usbgem_free_memory(dp); in usbgem_alloc_memory()
484 req->bulk_client_private = (usb_opaque_t)dp->tx_free_list; in usbgem_alloc_memory()
485 dp->tx_free_list = req; in usbgem_alloc_memory()
506 usbgem_send_common(struct usbgem_dev *dp, mblk_t *mp, uint32_t flags) in usbgem_send_common() argument
519 DPRINTF(2, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_send_common()
532 new = (*dp->ugc.usbgc_tx_make_packet)(dp, mp); in usbgem_send_common()
539 dp->name, __func__)); in usbgem_send_common()
542 mutex_enter(&dp->txlock); in usbgem_send_common()
543 dp->stats.noxmtbuf++; in usbgem_send_common()
544 dp->stats.errxmt++; in usbgem_send_common()
545 mutex_exit(&dp->txlock); in usbgem_send_common()
552 mutex_enter(&dp->txlock); in usbgem_send_common()
553 if (dp->tx_free_list == NULL) { in usbgem_send_common()
557 ASSERT(dp->tx_busy_cnt == dp->ugc.usbgc_tx_list_max); in usbgem_send_common()
558 mutex_exit(&dp->txlock); in usbgem_send_common()
561 dp->name, __func__)); in usbgem_send_common()
568 req = dp->tx_free_list; in usbgem_send_common()
569 dp->tx_free_list = (usb_bulk_req_t *)req->bulk_client_private; in usbgem_send_common()
570 dp->tx_busy_cnt++; in usbgem_send_common()
572 if (dp->tx_free_list == NULL) { in usbgem_send_common()
576 dp->tx_intr_pended++; in usbgem_send_common()
580 new->b_datap->db_cksum32 = dp->tx_seq_num; in usbgem_send_common()
581 dp->tx_seq_num++; in usbgem_send_common()
583 dp->stats.obytes += len; in usbgem_send_common()
584 dp->stats.opackets++; in usbgem_send_common()
586 dp->stats.obcast += bcast; in usbgem_send_common()
587 dp->stats.omcast += mcast; in usbgem_send_common()
589 mutex_exit(&dp->txlock); in usbgem_send_common()
591 DPRINTF(2, (CE_CONT, "!%s: %s: sending", dp->name, __func__)); in usbgem_send_common()
595 req->bulk_client_private = (usb_opaque_t)dp; in usbgem_send_common()
596 req->bulk_timeout = dp->bulkout_timeout; /* in second */ in usbgem_send_common()
606 if ((err = usb_pipe_bulk_xfer(dp->bulkout_pipe, req, usb_flags)) in usbgem_send_common()
614 mutex_enter(&dp->txlock); in usbgem_send_common()
615 dp->tx_busy_cnt--; in usbgem_send_common()
616 req->bulk_client_private = (usb_opaque_t)dp->tx_free_list; in usbgem_send_common()
617 dp->tx_free_list = req; in usbgem_send_common()
618 mutex_exit(&dp->txlock); in usbgem_send_common()
622 dp->name, __func__, err); in usbgem_send_common()
625 if (dp->fatal_error == (clock_t)0) { in usbgem_send_common()
626 dp->fatal_error = usbgem_timestamp_nz(); in usbgem_send_common()
630 dp->tx_start_time = ddi_get_lbolt(); in usbgem_send_common()
634 usbgem_bulkout_cb(dp->bulkout_pipe, req); in usbgem_send_common()
644 usbgem_restart_nic(struct usbgem_dev *dp) in usbgem_restart_nic() argument
649 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_restart_nic()
651 ASSERT(dp->mac_state != MAC_STATE_DISCONNECTED); in usbgem_restart_nic()
656 if (dp->mac_state == MAC_STATE_ONLINE) { in usbgem_restart_nic()
657 (void) usbgem_mac_stop(dp, MAC_STATE_STOPPED, STOP_GRACEFUL); in usbgem_restart_nic()
661 if (usbgem_hal_reset_chip(dp) != USB_SUCCESS) { in usbgem_restart_nic()
663 dp->name, __func__); in usbgem_restart_nic()
670 if (dp->nic_state < NIC_STATE_INITIALIZED) { in usbgem_restart_nic()
674 if (usbgem_mac_init(dp) != USB_SUCCESS) { in usbgem_restart_nic()
676 dp->name, __func__); in usbgem_restart_nic()
681 sema_p(&dp->rxfilter_lock); in usbgem_restart_nic()
682 dp->rxmode |= RXMODE_ENABLE; in usbgem_restart_nic()
683 ret = usbgem_hal_set_rx_filter(dp); in usbgem_restart_nic()
684 sema_v(&dp->rxfilter_lock); in usbgem_restart_nic()
692 cv_signal(&dp->link_watcher_wait_cv); in usbgem_restart_nic()
701 if (dp->mii_state == MII_STATE_LINKUP) { in usbgem_restart_nic()
702 if (usbgem_hal_set_media(dp) != USB_SUCCESS) { in usbgem_restart_nic()
705 if (dp->nic_state < NIC_STATE_ONLINE) { in usbgem_restart_nic()
709 (void) usbgem_mac_start(dp); in usbgem_restart_nic()
719 usbgem_tx_timeout(struct usbgem_dev *dp) in usbgem_tx_timeout() argument
725 mutex_enter(&dp->tx_watcher_lock); in usbgem_tx_timeout()
726 (void) cv_timedwait(&dp->tx_watcher_cv, &dp->tx_watcher_lock, in usbgem_tx_timeout()
727 dp->tx_watcher_interval + ddi_get_lbolt()); in usbgem_tx_timeout()
728 mutex_exit(&dp->tx_watcher_lock); in usbgem_tx_timeout()
730 if (dp->tx_watcher_stop) { in usbgem_tx_timeout()
738 rw_enter(&dp->dev_state_lock, rwlock); in usbgem_tx_timeout()
740 if ((dp->mac_state != MAC_STATE_DISCONNECTED && in usbgem_tx_timeout()
741 dp->fatal_error && in usbgem_tx_timeout()
742 now - dp->fatal_error >= dp->ugc.usbgc_tx_timeout) || in usbgem_tx_timeout()
743 (dp->mac_state == MAC_STATE_ONLINE && in usbgem_tx_timeout()
744 dp->mii_state == MII_STATE_LINKUP && in usbgem_tx_timeout()
745 dp->tx_busy_cnt != 0 && in usbgem_tx_timeout()
746 now - dp->tx_start_time >= dp->ugc.usbgc_tx_timeout)) { in usbgem_tx_timeout()
753 rw_exit(&dp->dev_state_lock); in usbgem_tx_timeout()
759 dp->name, __func__, in usbgem_tx_timeout()
760 dp->fatal_error ? now - dp->fatal_error: 0, in usbgem_tx_timeout()
761 dp->nic_state, dp->mac_state, in usbgem_tx_timeout()
762 dp->tx_busy_cnt ? now - dp->tx_start_time : 0); in usbgem_tx_timeout()
764 (void) usbgem_restart_nic(dp); in usbgem_tx_timeout()
767 rw_exit(&dp->dev_state_lock); in usbgem_tx_timeout()
772 usbgem_tx_watcher_start(struct usbgem_dev *dp) in usbgem_tx_watcher_start() argument
777 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_tx_watcher_start()
780 dp->tx_watcher_stop = 0; in usbgem_tx_watcher_start()
781 dp->tx_watcher_interval = drv_usectohz(1000*1000); in usbgem_tx_watcher_start()
783 wdth = thread_create(NULL, 0, usbgem_tx_timeout, dp, 0, &p0, in usbgem_tx_watcher_start()
788 dp->name, __func__); in usbgem_tx_watcher_start()
791 dp->tx_watcher_did = wdth->t_did; in usbgem_tx_watcher_start()
797 usbgem_tx_watcher_stop(struct usbgem_dev *dp) in usbgem_tx_watcher_stop() argument
799 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_tx_watcher_stop()
800 if (dp->tx_watcher_did) { in usbgem_tx_watcher_stop()
802 dp->tx_watcher_stop = 1; in usbgem_tx_watcher_stop()
803 cv_signal(&dp->tx_watcher_cv); in usbgem_tx_watcher_stop()
804 thread_join(dp->tx_watcher_did); in usbgem_tx_watcher_stop()
805 dp->tx_watcher_did = 0; in usbgem_tx_watcher_stop()
825 struct usbgem_dev *dp; in usbgem_bulkin_cb() local
827 dp = (struct usbgem_dev *)req->bulk_client_private; in usbgem_bulkin_cb()
832 dp->name, __func__, mp, in usbgem_bulkin_cb()
845 dp->nic_state == NIC_STATE_ONLINE) { in usbgem_bulkin_cb()
846 newmp = (*dp->ugc.usbgc_rx_make_packet)(dp, mp); in usbgem_bulkin_cb()
868 mac_rx(dp->mh, NULL, newmp); in usbgem_bulkin_cb()
874 mutex_enter(&dp->rxlock); in usbgem_bulkin_cb()
876 if (dp->rx_active) { in usbgem_bulkin_cb()
877 dp->rx_active = dp->mac_state == MAC_STATE_ONLINE; in usbgem_bulkin_cb()
880 dp->stats.rbytes += len; in usbgem_bulkin_cb()
881 dp->stats.rpackets += pkts; in usbgem_bulkin_cb()
883 dp->stats.rbcast += bcast; in usbgem_bulkin_cb()
884 dp->stats.rmcast += mcast; in usbgem_bulkin_cb()
886 mutex_exit(&dp->rxlock); in usbgem_bulkin_cb()
888 if (dp->rx_active) { in usbgem_bulkin_cb()
890 if (usbgem_rx_start_unit(dp, req)) { in usbgem_bulkin_cb()
896 dp->name, __func__); in usbgem_bulkin_cb()
902 if (dp->fatal_error == (clock_t)0) { in usbgem_bulkin_cb()
903 dp->fatal_error = usbgem_timestamp_nz(); in usbgem_bulkin_cb()
910 mutex_enter(&dp->rxlock); in usbgem_bulkin_cb()
911 dp->rx_active = B_FALSE; in usbgem_bulkin_cb()
912 dp->rx_busy_cnt--; in usbgem_bulkin_cb()
913 if (dp->rx_busy_cnt == 0) { in usbgem_bulkin_cb()
915 cv_broadcast(&dp->rx_drain_cv); in usbgem_bulkin_cb()
917 mutex_exit(&dp->rxlock); in usbgem_bulkin_cb()
927 struct usbgem_dev *dp; in usbgem_bulkout_cb() local
929 dp = (struct usbgem_dev *)req->bulk_client_private; in usbgem_bulkout_cb()
934 dp->name, __func__, in usbgem_bulkout_cb()
938 dp->tx_busy_cnt)); in usbgem_bulkout_cb()
945 dp->fatal_error == (clock_t)0) { in usbgem_bulkout_cb()
946 dp->fatal_error = usbgem_timestamp_nz(); in usbgem_bulkout_cb()
949 mutex_enter(&dp->txlock); in usbgem_bulkout_cb()
952 ASSERT(dp->tx_intr_pended > 0); in usbgem_bulkout_cb()
954 if (--(dp->tx_intr_pended) == 0) { in usbgem_bulkout_cb()
959 ASSERT(dp->tx_busy_cnt > 0); in usbgem_bulkout_cb()
960 req->bulk_client_private = (usb_opaque_t)dp->tx_free_list; in usbgem_bulkout_cb()
961 dp->tx_free_list = req; in usbgem_bulkout_cb()
962 dp->tx_busy_cnt--; in usbgem_bulkout_cb()
966 dp->tx_max_packets = in usbgem_bulkout_cb()
967 min(dp->tx_max_packets + 1, dp->ugc.usbgc_tx_list_max); in usbgem_bulkout_cb()
970 if (dp->mac_state != MAC_STATE_ONLINE && dp->tx_busy_cnt == 0) { in usbgem_bulkout_cb()
971 cv_broadcast(&dp->tx_drain_cv); in usbgem_bulkout_cb()
974 mutex_exit(&dp->txlock); in usbgem_bulkout_cb()
977 mac_tx_update(dp->mh); in usbgem_bulkout_cb()
984 struct usbgem_dev *dp; in usbgem_intr_cb() local
986 dp = (struct usbgem_dev *)req->intr_client_private; in usbgem_intr_cb()
987 dp->stats.intr++; in usbgem_intr_cb()
990 (*dp->ugc.usbgc_interrupt)(dp, req->intr_data); in usbgem_intr_cb()
1003 usbgem_choose_forcedmode(struct usbgem_dev *dp) in usbgem_choose_forcedmode() argument
1006 if (dp->anadv_1000fdx || dp->anadv_1000hdx) { in usbgem_choose_forcedmode()
1007 dp->speed = USBGEM_SPD_1000; in usbgem_choose_forcedmode()
1008 dp->full_duplex = dp->anadv_1000fdx; in usbgem_choose_forcedmode()
1009 } else if (dp->anadv_100fdx || dp->anadv_100t4) { in usbgem_choose_forcedmode()
1010 dp->speed = USBGEM_SPD_100; in usbgem_choose_forcedmode()
1011 dp->full_duplex = B_TRUE; in usbgem_choose_forcedmode()
1012 } else if (dp->anadv_100hdx) { in usbgem_choose_forcedmode()
1013 dp->speed = USBGEM_SPD_100; in usbgem_choose_forcedmode()
1014 dp->full_duplex = B_FALSE; in usbgem_choose_forcedmode()
1016 dp->speed = USBGEM_SPD_10; in usbgem_choose_forcedmode()
1017 dp->full_duplex = dp->anadv_10fdx; in usbgem_choose_forcedmode()
1022 usbgem_mii_read(struct usbgem_dev *dp, uint_t reg, int *errp) in usbgem_mii_read() argument
1026 sema_p(&dp->hal_op_lock); in usbgem_mii_read()
1027 val = (*dp->ugc.usbgc_mii_read)(dp, reg, errp); in usbgem_mii_read()
1028 sema_v(&dp->hal_op_lock); in usbgem_mii_read()
1034 usbgem_mii_write(struct usbgem_dev *dp, uint_t reg, uint16_t val, int *errp) in usbgem_mii_write() argument
1036 sema_p(&dp->hal_op_lock); in usbgem_mii_write()
1037 (*dp->ugc.usbgc_mii_write)(dp, reg, val, errp); in usbgem_mii_write()
1038 sema_v(&dp->hal_op_lock); in usbgem_mii_write()
1042 usbgem_mii_probe(struct usbgem_dev *dp) in usbgem_mii_probe() argument
1046 err = (*dp->ugc.usbgc_mii_probe)(dp); in usbgem_mii_probe()
1051 usbgem_mii_init(struct usbgem_dev *dp) in usbgem_mii_init() argument
1055 err = (*dp->ugc.usbgc_mii_init)(dp); in usbgem_mii_init()
1064 usbgem_mii_config_default(struct usbgem_dev *dp, int *errp) in usbgem_mii_config_default() argument
1069 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mii_config_default()
1074 mii_stat = dp->mii_status; in usbgem_mii_config_default()
1077 dp->name, __func__, mii_stat, MII_STATUS_BITS)); in usbgem_mii_config_default()
1082 dp->name, mii_stat, MII_STATUS_BITS); in usbgem_mii_config_default()
1087 val = usbgem_mii_read(dp, MII_AN_ADVERT, errp) & ~MII_ABILITY_ALL; in usbgem_mii_config_default()
1094 dp->name, __func__, in usbgem_mii_config_default()
1095 dp->anadv_100t4, dp->anadv_100fdx, dp->anadv_100hdx, in usbgem_mii_config_default()
1096 dp->anadv_10fdx, dp->anadv_10hdx)); in usbgem_mii_config_default()
1099 if (dp->anadv_100t4) { in usbgem_mii_config_default()
1102 if (dp->anadv_100fdx) { in usbgem_mii_config_default()
1105 if (dp->anadv_100hdx) { in usbgem_mii_config_default()
1108 if (dp->anadv_10fdx) { in usbgem_mii_config_default()
1111 if (dp->anadv_10hdx) { in usbgem_mii_config_default()
1116 if (dp->anadv_pause) { in usbgem_mii_config_default()
1119 if (dp->anadv_asmpause) { in usbgem_mii_config_default()
1125 dp->name, __func__, val, MII_ABILITY_BITS, in usbgem_mii_config_default()
1126 dp->anadv_pause, dp->anadv_asmpause)); in usbgem_mii_config_default()
1128 usbgem_mii_write(dp, MII_AN_ADVERT, val, errp); in usbgem_mii_config_default()
1133 if (dp->mii_status & MII_STATUS_XSTATUS) { in usbgem_mii_config_default()
1137 if (!dp->anadv_autoneg) { in usbgem_mii_config_default()
1140 if (dp->anadv_1000t_ms == 2) { in usbgem_mii_config_default()
1145 if (dp->anadv_1000fdx) { in usbgem_mii_config_default()
1148 if (dp->anadv_1000hdx) { in usbgem_mii_config_default()
1151 switch (dp->anadv_1000t_ms) { in usbgem_mii_config_default()
1169 dp->name, __func__, val, MII_1000TC_BITS)); in usbgem_mii_config_default()
1171 usbgem_mii_write(dp, MII_1000TC, val, errp); in usbgem_mii_config_default()
1189 #define USBGEM_LINKUP(dp) mac_link_update((dp)->mh, LINK_STATE_UP) argument
1190 #define USBGEM_LINKDOWN(dp) mac_link_update((dp)->mh, LINK_STATE_DOWN) argument
1217 usbgem_mii_link_check(struct usbgem_dev *dp, int *oldstatep, int *newstatep) in usbgem_mii_link_check() argument
1235 dp->name, __func__, ddi_get_lbolt(), dp->mii_state)); in usbgem_mii_link_check()
1237 if (dp->mii_state != MII_STATE_LINKUP) { in usbgem_mii_link_check()
1243 rw_enter(&dp->dev_state_lock, rwlock); in usbgem_mii_link_check()
1246 *oldstatep = dp->mii_state; in usbgem_mii_link_check()
1248 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_mii_link_check()
1250 dp->mii_interval = 0; in usbgem_mii_link_check()
1256 diff = now - dp->mii_last_check; in usbgem_mii_link_check()
1257 dp->mii_last_check = now; in usbgem_mii_link_check()
1263 if (dp->linkup_delay > 0) { in usbgem_mii_link_check()
1264 if (dp->linkup_delay > diff) { in usbgem_mii_link_check()
1265 dp->linkup_delay -= diff; in usbgem_mii_link_check()
1268 dp->linkup_delay = -1; in usbgem_mii_link_check()
1273 switch (dp->mii_state) { in usbgem_mii_link_check()
1278 dp->mii_timer -= diff; in usbgem_mii_link_check()
1279 if (dp->mii_timer > 0) { in usbgem_mii_link_check()
1281 dp->mii_interval = WATCH_INTERVAL_FAST; in usbgem_mii_link_check()
1285 val = usbgem_mii_read(dp, MII_CONTROL, &err); in usbgem_mii_link_check()
1293 dp->name, ddi_get_lbolt(), in usbgem_mii_link_check()
1298 usbgem_mii_write(dp, MII_CONTROL, 0, &err); in usbgem_mii_link_check()
1303 val = usbgem_mii_read(dp, MII_CONTROL, &err); in usbgem_mii_link_check()
1305 dp->name, val, MII_CONTROL_BITS); in usbgem_mii_link_check()
1308 if ((*dp->ugc.usbgc_mii_config)(dp, &err) != USB_SUCCESS) { in usbgem_mii_link_check()
1314 usbgem_choose_forcedmode(dp); in usbgem_mii_link_check()
1316 dp->mii_lpable = 0; in usbgem_mii_link_check()
1317 dp->mii_advert = 0; in usbgem_mii_link_check()
1318 dp->mii_exp = 0; in usbgem_mii_link_check()
1319 dp->mii_ctl1000 = 0; in usbgem_mii_link_check()
1320 dp->mii_stat1000 = 0; in usbgem_mii_link_check()
1322 dp->flow_control = FLOW_CONTROL_NONE; in usbgem_mii_link_check()
1324 if (!dp->anadv_autoneg) { in usbgem_mii_link_check()
1326 dp->mii_state = MII_STATE_MEDIA_SETUP; in usbgem_mii_link_check()
1327 dp->mii_timer = dp->ugc.usbgc_mii_linkdown_timeout; in usbgem_mii_link_check()
1338 dp->mii_timer -= diff; in usbgem_mii_link_check()
1339 if (dp->mii_timer - in usbgem_mii_link_check()
1340 (dp->ugc.usbgc_mii_an_timeout - dp->ugc.usbgc_mii_an_wait) in usbgem_mii_link_check()
1343 dp->mii_interval = WATCH_INTERVAL_FAST; in usbgem_mii_link_check()
1348 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_link_check()
1354 dp->name, __func__, dp->mii_state, in usbgem_mii_link_check()
1364 dp->name); in usbgem_mii_link_check()
1369 if (dp->mii_timer <= 0) { in usbgem_mii_link_check()
1374 if (!dp->mii_supress_msg) { in usbgem_mii_link_check()
1378 dp->name); in usbgem_mii_link_check()
1379 dp->mii_supress_msg = B_TRUE; in usbgem_mii_link_check()
1386 dp->mii_interval = dp->ugc.usbgc_mii_an_watch_interval; in usbgem_mii_link_check()
1393 dp->mii_state = MII_STATE_AN_DONE; in usbgem_mii_link_check()
1394 dp->mii_supress_msg = B_FALSE; in usbgem_mii_link_check()
1397 dp->name, status, MII_STATUS_BITS)); in usbgem_mii_link_check()
1399 if (dp->ugc.usbgc_mii_an_delay > 0) { in usbgem_mii_link_check()
1400 dp->mii_timer = dp->ugc.usbgc_mii_an_delay; in usbgem_mii_link_check()
1401 dp->mii_interval = drv_usectohz(20*1000); in usbgem_mii_link_check()
1405 dp->mii_timer = 0; in usbgem_mii_link_check()
1413 dp->mii_timer -= diff; in usbgem_mii_link_check()
1414 if (dp->mii_timer > 0) { in usbgem_mii_link_check()
1416 dp->mii_interval = WATCH_INTERVAL_FAST; in usbgem_mii_link_check()
1429 if (dp->ugc.usbgc_mii_an_delay > 0) { in usbgem_mii_link_check()
1431 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_link_check()
1436 advert = usbgem_mii_read(dp, MII_AN_ADVERT, &err); in usbgem_mii_link_check()
1440 lpable = usbgem_mii_read(dp, MII_AN_LPABLE, &err); in usbgem_mii_link_check()
1444 exp = usbgem_mii_read(dp, MII_AN_EXPANSION, &err); in usbgem_mii_link_check()
1455 if (dp->mii_status & MII_STATUS_XSTATUS) { in usbgem_mii_link_check()
1456 ctl1000 = usbgem_mii_read(dp, MII_1000TC, &err); in usbgem_mii_link_check()
1460 stat1000 = usbgem_mii_read(dp, MII_1000TS, &err); in usbgem_mii_link_check()
1465 dp->mii_lpable = lpable; in usbgem_mii_link_check()
1466 dp->mii_advert = advert; in usbgem_mii_link_check()
1467 dp->mii_exp = exp; in usbgem_mii_link_check()
1468 dp->mii_ctl1000 = ctl1000; in usbgem_mii_link_check()
1469 dp->mii_stat1000 = stat1000; in usbgem_mii_link_check()
1474 dp->name, in usbgem_mii_link_check()
1481 dp->name, status, MII_STATUS_BITS)); in usbgem_mii_link_check()
1483 if (dp->mii_status & MII_STATUS_XSTATUS) { in usbgem_mii_link_check()
1497 dp->name); in usbgem_mii_link_check()
1510 cmn_err(CE_WARN, "!%s: wrong lpable.", dp->name); in usbgem_mii_link_check()
1520 dp->speed = USBGEM_SPD_1000; in usbgem_mii_link_check()
1521 dp->full_duplex = B_TRUE; in usbgem_mii_link_check()
1525 dp->speed = USBGEM_SPD_1000; in usbgem_mii_link_check()
1526 dp->full_duplex = B_FALSE; in usbgem_mii_link_check()
1529 dp->speed = USBGEM_SPD_100; in usbgem_mii_link_check()
1530 dp->full_duplex = B_TRUE; in usbgem_mii_link_check()
1533 dp->speed = USBGEM_SPD_100; in usbgem_mii_link_check()
1534 dp->full_duplex = B_TRUE; in usbgem_mii_link_check()
1537 dp->speed = USBGEM_SPD_100; in usbgem_mii_link_check()
1538 dp->full_duplex = B_FALSE; in usbgem_mii_link_check()
1541 dp->speed = USBGEM_SPD_10; in usbgem_mii_link_check()
1542 dp->full_duplex = B_TRUE; in usbgem_mii_link_check()
1545 dp->speed = USBGEM_SPD_10; in usbgem_mii_link_check()
1546 dp->full_duplex = B_FALSE; in usbgem_mii_link_check()
1554 val = usbgem_mii_read(dp, MII_CONTROL, &err); in usbgem_mii_link_check()
1560 dp->speed = (val & MII_CONTROL_100MB) ? in usbgem_mii_link_check()
1562 dp->full_duplex = B_FALSE; in usbgem_mii_link_check()
1570 dp->name, in usbgem_mii_link_check()
1574 usbgem_speed_value[dp->speed], in usbgem_mii_link_check()
1575 dp->full_duplex ? "full" : "half"); in usbgem_mii_link_check()
1578 if (dp->full_duplex) { in usbgem_mii_link_check()
1579 dp->flow_control = in usbgem_mii_link_check()
1583 dp->flow_control = FLOW_CONTROL_NONE; in usbgem_mii_link_check()
1585 dp->mii_state = MII_STATE_MEDIA_SETUP; in usbgem_mii_link_check()
1586 dp->mii_timer = dp->ugc.usbgc_mii_linkdown_timeout; in usbgem_mii_link_check()
1590 DPRINTF(2, (CE_CONT, "!%s: setup midia mode", dp->name)); in usbgem_mii_link_check()
1593 dp->mii_state = MII_STATE_LINKDOWN; in usbgem_mii_link_check()
1594 dp->mii_supress_msg = B_FALSE; in usbgem_mii_link_check()
1597 dp->mii_interval = WATCH_INTERVAL_FAST; in usbgem_mii_link_check()
1599 if ((!dp->anadv_autoneg) || in usbgem_mii_link_check()
1600 dp->ugc.usbgc_mii_an_oneshot || fix_phy) { in usbgem_mii_link_check()
1605 val = usbgem_mii_read(dp, MII_CONTROL, &err); in usbgem_mii_link_check()
1612 if (dp->full_duplex) { in usbgem_mii_link_check()
1616 switch (dp->speed) { in usbgem_mii_link_check()
1627 dp->name, dp->speed); in usbgem_mii_link_check()
1635 if (dp->mii_status & MII_STATUS_XSTATUS) { in usbgem_mii_link_check()
1636 usbgem_mii_write(dp, in usbgem_mii_link_check()
1642 usbgem_mii_write(dp, MII_CONTROL, val, &err); in usbgem_mii_link_check()
1654 if (dp->nic_state >= NIC_STATE_INITIALIZED) { in usbgem_mii_link_check()
1656 if (usbgem_hal_set_media(dp) != USB_SUCCESS) { in usbgem_mii_link_check()
1663 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_link_check()
1671 dp->mii_state = MII_STATE_LINKUP; in usbgem_mii_link_check()
1672 dp->mii_supress_msg = B_FALSE; in usbgem_mii_link_check()
1676 dp->name, status, MII_STATUS_BITS)); in usbgem_mii_link_check()
1684 dp->name, in usbgem_mii_link_check()
1685 usbgem_speed_value[dp->speed], in usbgem_mii_link_check()
1686 dp->full_duplex ? "full" : "half", in usbgem_mii_link_check()
1687 usbgem_fc_type[dp->flow_control]); in usbgem_mii_link_check()
1689 dp->mii_interval = in usbgem_mii_link_check()
1690 dp->ugc.usbgc_mii_link_watch_interval; in usbgem_mii_link_check()
1692 if (dp->ugc.usbgc_mii_hw_link_detection && in usbgem_mii_link_check()
1693 dp->nic_state == NIC_STATE_ONLINE) { in usbgem_mii_link_check()
1694 dp->mii_interval = 0; in usbgem_mii_link_check()
1697 if (dp->nic_state == NIC_STATE_ONLINE) { in usbgem_mii_link_check()
1698 if (dp->mac_state == MAC_STATE_INITIALIZED) { in usbgem_mii_link_check()
1699 (void) usbgem_mac_start(dp); in usbgem_mii_link_check()
1707 dp->mii_supress_msg = B_TRUE; in usbgem_mii_link_check()
1708 if (dp->anadv_autoneg) { in usbgem_mii_link_check()
1709 dp->mii_timer -= diff; in usbgem_mii_link_check()
1710 if (dp->mii_timer <= 0) { in usbgem_mii_link_check()
1716 dp->ugc.usbgc_mii_linkdown_timeout_action; in usbgem_mii_link_check()
1726 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_link_check()
1737 dp->name, status, MII_STATUS_BITS); in usbgem_mii_link_check()
1743 rw_exit(&dp->dev_state_lock); in usbgem_mii_link_check()
1747 dp->mii_state = MII_STATE_LINKDOWN; in usbgem_mii_link_check()
1748 dp->mii_timer = dp->ugc.usbgc_mii_linkdown_timeout; in usbgem_mii_link_check()
1754 if (dp->nic_state == NIC_STATE_ONLINE && in usbgem_mii_link_check()
1755 dp->mac_state == MAC_STATE_ONLINE && in usbgem_mii_link_check()
1756 dp->ugc.usbgc_mii_stop_mac_on_linkdown) { in usbgem_mii_link_check()
1757 (void) usbgem_restart_nic(dp); in usbgem_mii_link_check()
1762 if (dp->anadv_autoneg) { in usbgem_mii_link_check()
1765 dp->ugc.usbgc_mii_linkdown_action; in usbgem_mii_link_check()
1772 dp->mii_interval = in usbgem_mii_link_check()
1773 dp->ugc.usbgc_mii_link_watch_interval; in usbgem_mii_link_check()
1781 if (dp->ugc.usbgc_mii_hw_link_detection && in usbgem_mii_link_check()
1782 dp->nic_state == NIC_STATE_ONLINE) { in usbgem_mii_link_check()
1787 dp->mii_interval = 0; in usbgem_mii_link_check()
1792 cmn_err(CE_PANIC, "!%s: %s: not reached", dp->name, __func__); in usbgem_mii_link_check()
1800 if (!dp->mii_supress_msg) { in usbgem_mii_link_check()
1801 cmn_err(CE_CONT, "!%s: resetting PHY", dp->name); in usbgem_mii_link_check()
1803 dp->mii_supress_msg = B_TRUE; in usbgem_mii_link_check()
1807 dp->mii_supress_msg = B_TRUE; in usbgem_mii_link_check()
1808 if (dp->ugc.usbgc_mii_an_oneshot) { in usbgem_mii_link_check()
1812 dp->mii_state = MII_STATE_AUTONEGOTIATING; in usbgem_mii_link_check()
1813 dp->mii_timer = dp->ugc.usbgc_mii_an_timeout; in usbgem_mii_link_check()
1814 dp->mii_interval = dp->ugc.usbgc_mii_an_watch_interval; in usbgem_mii_link_check()
1818 if (!dp->mii_supress_msg) { in usbgem_mii_link_check()
1820 dp->name); in usbgem_mii_link_check()
1822 dp->mii_supress_msg = B_TRUE; in usbgem_mii_link_check()
1827 dp->name, dp->ugc.usbgc_mii_linkdown_action); in usbgem_mii_link_check()
1832 if (!dp->mii_supress_msg) { in usbgem_mii_link_check()
1833 cmn_err(CE_CONT, "!%s: resetting PHY", dp->name); in usbgem_mii_link_check()
1835 dp->mii_state = MII_STATE_RESETTING; in usbgem_mii_link_check()
1836 dp->mii_timer = dp->ugc.usbgc_mii_reset_timeout; in usbgem_mii_link_check()
1837 if (!dp->ugc.usbgc_mii_dont_reset) { in usbgem_mii_link_check()
1838 usbgem_mii_write(dp, MII_CONTROL, MII_CONTROL_RESET, &err); in usbgem_mii_link_check()
1843 dp->mii_interval = WATCH_INTERVAL_FAST; in usbgem_mii_link_check()
1847 if (!dp->mii_supress_msg) { in usbgem_mii_link_check()
1848 cmn_err(CE_CONT, "!%s: auto-negotiation started", dp->name); in usbgem_mii_link_check()
1850 dp->mii_state = MII_STATE_AUTONEGOTIATING; in usbgem_mii_link_check()
1851 dp->mii_timer = dp->ugc.usbgc_mii_an_timeout; in usbgem_mii_link_check()
1854 val = usbgem_mii_read(dp, MII_CONTROL, &err) & in usbgem_mii_link_check()
1862 usbgem_mii_write(dp, MII_CONTROL, in usbgem_mii_link_check()
1863 val | dp->ugc.usbgc_mii_an_cmd | MII_CONTROL_ANE, &err); in usbgem_mii_link_check()
1868 dp->mii_interval = dp->ugc.usbgc_mii_an_watch_interval; in usbgem_mii_link_check()
1872 dp->mii_state = MII_STATE_UNKNOWN; in usbgem_mii_link_check()
1873 dp->mii_interval = dp->ugc.usbgc_mii_link_watch_interval; in usbgem_mii_link_check()
1877 *newstatep = dp->mii_state; in usbgem_mii_link_check()
1878 rw_exit(&dp->dev_state_lock); in usbgem_mii_link_check()
1883 usbgem_mii_link_watcher(struct usbgem_dev *dp) in usbgem_mii_link_watcher() argument
1889 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mii_link_watcher()
1893 mutex_enter(&dp->link_watcher_lock); in usbgem_mii_link_watcher()
1894 if (dp->mii_interval) { in usbgem_mii_link_watcher()
1895 (void) cv_timedwait(&dp->link_watcher_wait_cv, in usbgem_mii_link_watcher()
1896 &dp->link_watcher_lock, in usbgem_mii_link_watcher()
1897 dp->mii_interval + ddi_get_lbolt()); in usbgem_mii_link_watcher()
1899 cv_wait(&dp->link_watcher_wait_cv, in usbgem_mii_link_watcher()
1900 &dp->link_watcher_lock); in usbgem_mii_link_watcher()
1902 mutex_exit(&dp->link_watcher_lock); in usbgem_mii_link_watcher()
1904 if (dp->link_watcher_stop) { in usbgem_mii_link_watcher()
1909 tx_sched = usbgem_mii_link_check(dp, in usbgem_mii_link_watcher()
1918 mac_tx_update(dp->mh); in usbgem_mii_link_watcher()
1924 dp->linkup_delay = 0; in usbgem_mii_link_watcher()
1925 USBGEM_LINKUP(dp); in usbgem_mii_link_watcher()
1926 } else if (dp->linkup_delay <= 0) { in usbgem_mii_link_watcher()
1927 USBGEM_LINKDOWN(dp); in usbgem_mii_link_watcher()
1929 } else if (dp->linkup_delay < 0) { in usbgem_mii_link_watcher()
1931 dp->linkup_delay = 0; in usbgem_mii_link_watcher()
1932 USBGEM_LINKDOWN(dp); in usbgem_mii_link_watcher()
1940 usbgem_mii_update_link(struct usbgem_dev *dp) in usbgem_mii_update_link() argument
1942 cv_signal(&dp->link_watcher_wait_cv); in usbgem_mii_update_link()
1946 usbgem_mii_probe_default(struct usbgem_dev *dp) in usbgem_mii_probe_default() argument
1955 DPRINTF(3, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mii_probe_default()
1960 dp->mii_status = 0; in usbgem_mii_probe_default()
1963 if (dp->mii_phy_addr) { in usbgem_mii_probe_default()
1964 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_probe_default()
1972 if (dp->mii_phy_addr < 0) { in usbgem_mii_probe_default()
1975 dp->name); in usbgem_mii_probe_default()
1981 dp->name, dp->mii_phy_addr); in usbgem_mii_probe_default()
1985 for (phy = dp->ugc.usbgc_mii_addr_min; phy < 32; phy++) { in usbgem_mii_probe_default()
1986 dp->mii_phy_addr = phy; in usbgem_mii_probe_default()
1987 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_probe_default()
1991 dp->name, __func__)); in usbgem_mii_probe_default()
1996 usbgem_mii_write(dp, MII_CONTROL, 0, &err); in usbgem_mii_probe_default()
2000 dp->name, __func__)); in usbgem_mii_probe_default()
2006 for (phy = dp->ugc.usbgc_mii_addr_min; phy < 32; phy++) { in usbgem_mii_probe_default()
2007 dp->mii_phy_addr = phy; in usbgem_mii_probe_default()
2008 usbgem_mii_write(dp, MII_CONTROL, 0, &err); in usbgem_mii_probe_default()
2012 dp->name, __func__)); in usbgem_mii_probe_default()
2015 status = usbgem_mii_read(dp, MII_STATUS, &err); in usbgem_mii_probe_default()
2019 dp->name, __func__)); in usbgem_mii_probe_default()
2028 cmn_err(CE_NOTE, "!%s: no MII PHY found", dp->name); in usbgem_mii_probe_default()
2032 dp->mii_status = status; in usbgem_mii_probe_default()
2033 dp->mii_status_ro = ~status; in usbgem_mii_probe_default()
2034 dp->mii_phy_id = usbgem_mii_read(dp, MII_PHYIDH, &err) << 16; in usbgem_mii_probe_default()
2038 dp->name, __func__)); in usbgem_mii_probe_default()
2041 dp->mii_phy_id |= usbgem_mii_read(dp, MII_PHYIDL, &err); in usbgem_mii_probe_default()
2045 dp->name, __func__)); in usbgem_mii_probe_default()
2049 if (dp->mii_phy_addr < 0) { in usbgem_mii_probe_default()
2051 dp->name, dp->mii_phy_id); in usbgem_mii_probe_default()
2054 dp->name, dp->mii_phy_id, dp->mii_phy_addr); in usbgem_mii_probe_default()
2059 dp->name, in usbgem_mii_probe_default()
2060 usbgem_mii_read(dp, MII_CONTROL, &err), MII_CONTROL_BITS, in usbgem_mii_probe_default()
2062 usbgem_mii_read(dp, MII_AN_ADVERT, &err), MII_ABILITY_BITS, in usbgem_mii_probe_default()
2063 usbgem_mii_read(dp, MII_AN_LPABLE, &err), MII_ABILITY_BITS, in usbgem_mii_probe_default()
2064 usbgem_mii_read(dp, MII_AN_EXPANSION, &err), MII_AN_EXP_BITS); in usbgem_mii_probe_default()
2066 dp->mii_xstatus = 0; in usbgem_mii_probe_default()
2068 dp->mii_xstatus = usbgem_mii_read(dp, MII_XSTATUS, &err); in usbgem_mii_probe_default()
2071 dp->name, dp->mii_xstatus, MII_XSTATUS_BITS); in usbgem_mii_probe_default()
2073 dp->mii_xstatus_ro = ~dp->mii_xstatus; in usbgem_mii_probe_default()
2076 adv_org = usbgem_mii_read(dp, MII_AN_ADVERT, &err); in usbgem_mii_probe_default()
2081 usbgem_mii_write(dp, MII_AN_ADVERT, in usbgem_mii_probe_default()
2087 adv = usbgem_mii_read(dp, MII_AN_ADVERT, &err); in usbgem_mii_probe_default()
2093 dp->ugc.usbgc_flow_control &= ~1; in usbgem_mii_probe_default()
2097 dp->ugc.usbgc_flow_control &= ~2; in usbgem_mii_probe_default()
2100 usbgem_mii_write(dp, MII_AN_ADVERT, adv_org, &err); in usbgem_mii_probe_default()
2111 usbgem_mii_init_default(struct usbgem_dev *dp) in usbgem_mii_init_default() argument
2118 usbgem_mii_start(struct usbgem_dev *dp) in usbgem_mii_start() argument
2123 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mii_start()
2126 dp->link_watcher_stop = 0; in usbgem_mii_start()
2127 dp->mii_state = MII_STATE_UNKNOWN; in usbgem_mii_start()
2128 dp->mii_interval = drv_usectohz(1000*1000); /* 1sec */ in usbgem_mii_start()
2129 dp->mii_last_check = ddi_get_lbolt(); in usbgem_mii_start()
2130 dp->linkup_delay = 600 * drv_usectohz(1000*1000); /* 10 minutes */ in usbgem_mii_start()
2132 lwth = thread_create(NULL, 0, usbgem_mii_link_watcher, dp, 0, &p0, in usbgem_mii_start()
2137 dp->name, __func__); in usbgem_mii_start()
2140 dp->link_watcher_did = lwth->t_did; in usbgem_mii_start()
2146 usbgem_mii_stop(struct usbgem_dev *dp) in usbgem_mii_stop() argument
2148 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mii_stop()
2151 dp->link_watcher_stop = 1; in usbgem_mii_stop()
2152 cv_signal(&dp->link_watcher_wait_cv); in usbgem_mii_stop()
2153 thread_join(dp->link_watcher_did); in usbgem_mii_stop()
2165 usbgem_mac_init(struct usbgem_dev *dp) in usbgem_mac_init() argument
2169 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mac_init()
2171 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_mac_init()
2176 ASSERT(dp->mac_state == MAC_STATE_STOPPED); in usbgem_mac_init()
2179 dp->fatal_error = (clock_t)0; in usbgem_mac_init()
2182 mutex_enter(&dp->txlock); in usbgem_mac_init()
2183 dp->tx_busy_cnt = 0; in usbgem_mac_init()
2184 dp->tx_max_packets = dp->ugc.usbgc_tx_list_max; in usbgem_mac_init()
2185 mutex_exit(&dp->txlock); in usbgem_mac_init()
2188 mutex_enter(&dp->rxlock); in usbgem_mac_init()
2189 dp->rx_busy_cnt = 0; in usbgem_mac_init()
2190 mutex_exit(&dp->rxlock); in usbgem_mac_init()
2192 err = usbgem_hal_init_chip(dp); in usbgem_mac_init()
2194 dp->mac_state = MAC_STATE_INITIALIZED; in usbgem_mac_init()
2204 usbgem_mac_start(struct usbgem_dev *dp) in usbgem_mac_start() argument
2213 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mac_start()
2215 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_mac_start()
2220 if (dp->mac_state != MAC_STATE_INITIALIZED) { in usbgem_mac_start()
2224 dp->name, __func__, dp->mac_state)); in usbgem_mac_start()
2228 dp->mac_state = MAC_STATE_ONLINE; in usbgem_mac_start()
2230 if (usbgem_hal_start_chip(dp) != USB_SUCCESS) { in usbgem_mac_start()
2233 dp->name, __func__); in usbgem_mac_start()
2238 usb_pipe_get_state(dp->intr_pipe, &p_state, 0); in usbgem_mac_start()
2242 if (dp->ugc.usbgc_interrupt && dp->intr_pipe) { in usbgem_mac_start()
2246 req = usb_alloc_intr_req(dp->dip, 0, USB_FLAGS_SLEEP); in usbgem_mac_start()
2249 dp->name, __func__); in usbgem_mac_start()
2253 req->intr_client_private = (usb_opaque_t)dp; in usbgem_mac_start()
2257 req->intr_len = dp->ep_intr->wMaxPacketSize; in usbgem_mac_start()
2263 err = usb_pipe_intr_xfer(dp->intr_pipe, req, flags); in usbgem_mac_start()
2267 dp->name, err); in usbgem_mac_start()
2273 if (usbgem_init_rx_buf(dp) != USB_SUCCESS) { in usbgem_mac_start()
2276 dp->rx_active = B_TRUE; in usbgem_mac_start()
2282 DPRINTF(0, (CE_CONT, "!%s: %s: FAULURE", dp->name, __func__)); in usbgem_mac_start()
2283 if (dp->ugc.usbgc_interrupt && dp->intr_pipe) { in usbgem_mac_start()
2284 usb_pipe_stop_intr_polling(dp->intr_pipe, USB_FLAGS_SLEEP); in usbgem_mac_start()
2287 ASSERT(dp->mac_state == MAC_STATE_ONLINE); in usbgem_mac_start()
2289 if (dp->fatal_error == (clock_t)0) { in usbgem_mac_start()
2290 dp->fatal_error = usbgem_timestamp_nz(); in usbgem_mac_start()
2296 usbgem_mac_stop(struct usbgem_dev *dp, int new_state, boolean_t graceful) in usbgem_mac_stop() argument
2298 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mac_stop()
2307 if (dp->ugc.usbgc_interrupt && dp->intr_pipe) { in usbgem_mac_stop()
2308 usb_pipe_stop_intr_polling(dp->intr_pipe, USB_FLAGS_SLEEP); in usbgem_mac_stop()
2313 if (usbgem_hal_stop_chip(dp) != USB_SUCCESS) { in usbgem_mac_stop()
2314 (void) usbgem_hal_reset_chip(dp); in usbgem_mac_stop()
2319 dp->mac_state = new_state; in usbgem_mac_stop()
2325 usb_pipe_reset(dp->dip, dp->bulkin_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_mac_stop()
2326 usb_pipe_reset(dp->dip, dp->bulkout_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_mac_stop()
2330 dp->name, __func__, dp->rx_busy_cnt, dp->tx_busy_cnt)); in usbgem_mac_stop()
2338 mutex_enter(&dp->rxlock); in usbgem_mac_stop()
2339 while (dp->rx_busy_cnt > 0) { in usbgem_mac_stop()
2340 cv_wait(&dp->rx_drain_cv, &dp->rxlock); in usbgem_mac_stop()
2342 mutex_exit(&dp->rxlock); in usbgem_mac_stop()
2345 dp->name, __func__, dp->rx_busy_cnt)); in usbgem_mac_stop()
2347 mutex_enter(&dp->txlock); in usbgem_mac_stop()
2348 while (dp->tx_busy_cnt > 0) { in usbgem_mac_stop()
2349 cv_wait(&dp->tx_drain_cv, &dp->txlock); in usbgem_mac_stop()
2351 mutex_exit(&dp->txlock); in usbgem_mac_stop()
2354 dp->name, __func__, dp->tx_busy_cnt)); in usbgem_mac_stop()
2360 usbgem_add_multicast(struct usbgem_dev *dp, const uint8_t *ep) in usbgem_add_multicast() argument
2365 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_add_multicast()
2367 sema_p(&dp->rxfilter_lock); in usbgem_add_multicast()
2368 if (dp->mc_count_req++ < USBGEM_MAXMC) { in usbgem_add_multicast()
2370 cnt = dp->mc_count; in usbgem_add_multicast()
2371 bcopy(ep, dp->mc_list[cnt].addr.ether_addr_octet, in usbgem_add_multicast()
2373 if (dp->ugc.usbgc_multicast_hash) { in usbgem_add_multicast()
2374 dp->mc_list[cnt].hash = in usbgem_add_multicast()
2375 (*dp->ugc.usbgc_multicast_hash)(dp, ep); in usbgem_add_multicast()
2377 dp->mc_count = cnt + 1; in usbgem_add_multicast()
2380 if (dp->mc_count_req != dp->mc_count) { in usbgem_add_multicast()
2382 dp->rxmode |= RXMODE_MULTI_OVF; in usbgem_add_multicast()
2384 dp->rxmode &= ~RXMODE_MULTI_OVF; in usbgem_add_multicast()
2387 if (dp->mac_state != MAC_STATE_DISCONNECTED) { in usbgem_add_multicast()
2389 err = usbgem_hal_set_rx_filter(dp); in usbgem_add_multicast()
2391 sema_v(&dp->rxfilter_lock); in usbgem_add_multicast()
2397 usbgem_remove_multicast(struct usbgem_dev *dp, const uint8_t *ep) in usbgem_remove_multicast() argument
2404 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_remove_multicast()
2406 sema_p(&dp->rxfilter_lock); in usbgem_remove_multicast()
2407 dp->mc_count_req--; in usbgem_remove_multicast()
2408 cnt = dp->mc_count; in usbgem_remove_multicast()
2410 if (bcmp(ep, &dp->mc_list[i].addr, ETHERADDRL)) { in usbgem_remove_multicast()
2414 len = (cnt - (i + 1)) * sizeof (*dp->mc_list); in usbgem_remove_multicast()
2416 bcopy(&dp->mc_list[i+1], &dp->mc_list[i], len); in usbgem_remove_multicast()
2418 dp->mc_count--; in usbgem_remove_multicast()
2422 if (dp->mc_count_req != dp->mc_count) { in usbgem_remove_multicast()
2424 dp->rxmode |= RXMODE_MULTI_OVF; in usbgem_remove_multicast()
2426 dp->rxmode &= ~RXMODE_MULTI_OVF; in usbgem_remove_multicast()
2429 if (dp->mac_state != MAC_STATE_DISCONNECTED) { in usbgem_remove_multicast()
2430 err = usbgem_hal_set_rx_filter(dp); in usbgem_remove_multicast()
2432 sema_v(&dp->rxfilter_lock); in usbgem_remove_multicast()
2454 usbgem_get_def_val(struct usbgem_dev *dp, mac_prop_id_t pr_num, in usbgem_get_def_val() argument
2464 BOOLEAN(dp->mii_status & MII_STATUS_CANAUTONEG); in usbgem_get_def_val()
2471 switch (dp->ugc.usbgc_flow_control) { in usbgem_get_def_val()
2491 (dp->mii_xstatus & MII_XSTATUS_1000BASET_FD) || in usbgem_get_def_val()
2492 (dp->mii_xstatus & MII_XSTATUS_1000BASEX_FD); in usbgem_get_def_val()
2498 (dp->mii_xstatus & MII_XSTATUS_1000BASET) || in usbgem_get_def_val()
2499 (dp->mii_xstatus & MII_XSTATUS_1000BASEX); in usbgem_get_def_val()
2505 BOOLEAN(dp->mii_status & MII_STATUS_100_BASE_T4); in usbgem_get_def_val()
2511 BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX_FD); in usbgem_get_def_val()
2517 BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX); in usbgem_get_def_val()
2523 BOOLEAN(dp->mii_status & MII_STATUS_10_FD); in usbgem_get_def_val()
2529 BOOLEAN(dp->mii_status & MII_STATUS_10); in usbgem_get_def_val()
2543 struct usbgem_dev *dp = arg; in usbgem_m_propinfo() local
2567 if ((dp->mii_xstatus_ro & MII_XSTATUS_1000BASET_FD) == 0) { in usbgem_m_propinfo()
2570 dp->mii_xstatus & MII_XSTATUS_1000BASET_FD)); in usbgem_m_propinfo()
2571 } else if ((dp->mii_xstatus_ro & MII_XSTATUS_1000BASEX_FD) in usbgem_m_propinfo()
2575 dp->mii_xstatus & MII_XSTATUS_1000BASEX_FD)); in usbgem_m_propinfo()
2582 if ((dp->mii_xstatus_ro & MII_XSTATUS_1000BASET) == 0) { in usbgem_m_propinfo()
2585 dp->mii_xstatus & MII_XSTATUS_1000BASET)); in usbgem_m_propinfo()
2586 } else if ((dp->mii_xstatus_ro & MII_XSTATUS_1000BASEX) == 0) { in usbgem_m_propinfo()
2589 dp->mii_xstatus & MII_XSTATUS_1000BASEX)); in usbgem_m_propinfo()
2596 if ((dp->mii_status_ro & MII_STATUS_100_BASEX_FD) == 0) { in usbgem_m_propinfo()
2598 BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX_FD)); in usbgem_m_propinfo()
2605 if ((dp->mii_status_ro & MII_STATUS_100_BASEX) == 0) { in usbgem_m_propinfo()
2607 BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX)); in usbgem_m_propinfo()
2614 if ((dp->mii_status_ro & MII_STATUS_10_FD) == 0) { in usbgem_m_propinfo()
2616 BOOLEAN(dp->mii_status & MII_STATUS_10_FD)); in usbgem_m_propinfo()
2623 if ((dp->mii_status_ro & MII_STATUS_10) == 0) { in usbgem_m_propinfo()
2625 BOOLEAN(dp->mii_status & MII_STATUS_10)); in usbgem_m_propinfo()
2632 if ((dp->mii_status_ro & MII_STATUS_CANAUTONEG) == 0) { in usbgem_m_propinfo()
2634 BOOLEAN(dp->mii_status & MII_STATUS_CANAUTONEG)); in usbgem_m_propinfo()
2641 switch (dp->ugc.usbgc_flow_control) { in usbgem_m_propinfo()
2660 dp->ugc.usbgc_min_mtu, dp->ugc.usbgc_max_mtu); in usbgem_m_propinfo()
2672 struct usbgem_dev *dp = arg; in usbgem_m_setprop() local
2678 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_m_setprop()
2681 if ((dp->mii_xstatus_ro & MII_XSTATUS_1000BASET_FD) == 0 || in usbgem_m_setprop()
2682 (dp->mii_xstatus_ro & MII_XSTATUS_1000BASEX_FD) == 0) { in usbgem_m_setprop()
2683 if (dp->anadv_1000fdx != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2684 dp->anadv_1000fdx = *(uint8_t *)pr_val; in usbgem_m_setprop()
2693 if ((dp->mii_xstatus_ro & MII_XSTATUS_1000BASET) == 0 || in usbgem_m_setprop()
2694 (dp->mii_xstatus_ro & MII_XSTATUS_1000BASEX) == 0) { in usbgem_m_setprop()
2695 if (dp->anadv_1000hdx != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2696 dp->anadv_1000hdx = *(uint8_t *)pr_val; in usbgem_m_setprop()
2705 if ((dp->mii_status_ro & MII_STATUS_100_BASEX_FD) == 0) { in usbgem_m_setprop()
2706 if (dp->anadv_100fdx != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2707 dp->anadv_100fdx = *(uint8_t *)pr_val; in usbgem_m_setprop()
2716 if ((dp->mii_status_ro & MII_STATUS_100_BASEX) == 0) { in usbgem_m_setprop()
2717 if (dp->anadv_100hdx != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2718 dp->anadv_100hdx = *(uint8_t *)pr_val; in usbgem_m_setprop()
2727 if ((dp->mii_status_ro & MII_STATUS_10_FD) == 0) { in usbgem_m_setprop()
2728 if (dp->anadv_10fdx != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2729 dp->anadv_10fdx = *(uint8_t *)pr_val; in usbgem_m_setprop()
2738 if ((dp->mii_status_ro & MII_STATUS_10_FD) == 0) { in usbgem_m_setprop()
2739 if (dp->anadv_10hdx != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2740 dp->anadv_10hdx = *(uint8_t *)pr_val; in usbgem_m_setprop()
2749 if ((dp->mii_status_ro & MII_STATUS_CANAUTONEG) == 0) { in usbgem_m_setprop()
2750 if (dp->anadv_autoneg != *(uint8_t *)pr_val) { in usbgem_m_setprop()
2751 dp->anadv_autoneg = *(uint8_t *)pr_val; in usbgem_m_setprop()
2768 if (dp->flow_control != FLOW_CONTROL_NONE) { in usbgem_m_setprop()
2769 dp->flow_control = FLOW_CONTROL_NONE; in usbgem_m_setprop()
2775 if (dp->flow_control != FLOW_CONTROL_RX_PAUSE) { in usbgem_m_setprop()
2776 dp->flow_control = FLOW_CONTROL_RX_PAUSE; in usbgem_m_setprop()
2782 if (dp->flow_control != FLOW_CONTROL_TX_PAUSE) { in usbgem_m_setprop()
2783 dp->flow_control = FLOW_CONTROL_TX_PAUSE; in usbgem_m_setprop()
2789 if (dp->flow_control != FLOW_CONTROL_SYMMETRIC) { in usbgem_m_setprop()
2790 dp->flow_control = FLOW_CONTROL_SYMMETRIC; in usbgem_m_setprop()
2811 if (new_mtu != dp->mtu) { in usbgem_m_setprop()
2827 usbgem_choose_forcedmode(dp); in usbgem_m_setprop()
2828 dp->mii_state = MII_STATE_UNKNOWN; in usbgem_m_setprop()
2829 cv_signal(&dp->link_watcher_wait_cv); in usbgem_m_setprop()
2831 rw_exit(&dp->dev_state_lock); in usbgem_m_setprop()
2839 struct usbgem_dev *dp = arg; in usbgem_m_getprop() local
2849 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_getprop()
2853 if (dp->mii_state != MII_STATE_LINKUP) { in usbgem_m_getprop()
2855 } else if (dp->full_duplex) { in usbgem_m_getprop()
2866 switch (dp->speed) { in usbgem_m_getprop()
2886 *(uint8_t *)pr_val = dp->anadv_autoneg; in usbgem_m_getprop()
2891 switch (dp->flow_control) { in usbgem_m_getprop()
2918 usbgem_get_def_val(dp, pr_num, pr_valsize, pr_val); in usbgem_m_getprop()
2922 *(uint8_t *)pr_val = dp->anadv_1000fdx; in usbgem_m_getprop()
2926 *(uint8_t *)pr_val = dp->anadv_1000hdx; in usbgem_m_getprop()
2930 *(uint8_t *)pr_val = dp->anadv_100fdx; in usbgem_m_getprop()
2934 *(uint8_t *)pr_val = dp->anadv_100hdx; in usbgem_m_getprop()
2938 *(uint8_t *)pr_val = dp->anadv_10fdx; in usbgem_m_getprop()
2942 *(uint8_t *)pr_val = dp->anadv_10hdx; in usbgem_m_getprop()
2946 *(uint8_t *)pr_val = dp->anadv_100t4; in usbgem_m_getprop()
2958 rw_exit(&dp->dev_state_lock); in usbgem_m_getprop()
2963 usbgem_mac_ioctl(struct usbgem_dev *dp, queue_t *wq, mblk_t *mp) in usbgem_mac_ioctl() argument
2968 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_mac_ioctl()
2976 DPRINTF(1, (CE_CONT, "%s: %s cmd:0x%x", dp->name, __func__, in usbgem_mac_ioctl()
2983 usbgem_mac_xcvr_inuse(struct usbgem_dev *dp) in usbgem_mac_xcvr_inuse() argument
2987 if ((dp->mii_status & MII_STATUS_XSTATUS) == 0) { in usbgem_mac_xcvr_inuse()
2988 if (dp->mii_status & MII_STATUS_100_BASE_T4) { in usbgem_mac_xcvr_inuse()
2990 } else if (dp->mii_status & in usbgem_mac_xcvr_inuse()
2994 } else if (dp->mii_status & in usbgem_mac_xcvr_inuse()
2998 } else if (dp->mii_status & in usbgem_mac_xcvr_inuse()
3002 } else if (dp->mii_xstatus & in usbgem_mac_xcvr_inuse()
3005 } else if (dp->mii_xstatus & in usbgem_mac_xcvr_inuse()
3055 struct usbgem_dev *dp = arg; in usbgem_m_start() local
3057 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_start()
3061 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_m_start()
3062 dp->nic_state = NIC_STATE_ONLINE; in usbgem_m_start()
3064 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_m_start()
3068 if (usbgem_mac_init(dp) != USB_SUCCESS) { in usbgem_m_start()
3073 sema_p(&dp->rxfilter_lock); in usbgem_m_start()
3074 dp->mc_count = 0; in usbgem_m_start()
3075 dp->mc_count_req = 0; in usbgem_m_start()
3077 bcopy(dp->dev_addr.ether_addr_octet, in usbgem_m_start()
3078 dp->cur_addr.ether_addr_octet, ETHERADDRL); in usbgem_m_start()
3079 dp->rxmode |= RXMODE_ENABLE; in usbgem_m_start()
3081 ret = usbgem_hal_set_rx_filter(dp); in usbgem_m_start()
3082 sema_v(&dp->rxfilter_lock); in usbgem_m_start()
3088 if (dp->mii_state == MII_STATE_LINKUP) { in usbgem_m_start()
3090 if (usbgem_hal_set_media(dp) != USB_SUCCESS) { in usbgem_m_start()
3093 if (usbgem_mac_start(dp) != USB_SUCCESS) { in usbgem_m_start()
3100 rw_exit(&dp->dev_state_lock); in usbgem_m_start()
3107 struct usbgem_dev *dp = arg; in usbgem_m_stop() local
3109 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_stop()
3112 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_stop()
3113 sema_p(&dp->rxfilter_lock); in usbgem_m_stop()
3114 dp->rxmode &= ~RXMODE_ENABLE; in usbgem_m_stop()
3116 if (dp->mac_state != MAC_STATE_DISCONNECTED) { in usbgem_m_stop()
3117 (void) usbgem_hal_set_rx_filter(dp); in usbgem_m_stop()
3119 sema_v(&dp->rxfilter_lock); in usbgem_m_stop()
3120 rw_exit(&dp->dev_state_lock); in usbgem_m_stop()
3123 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_m_stop()
3124 dp->nic_state = NIC_STATE_STOPPED; in usbgem_m_stop()
3127 if (dp->mac_state != MAC_STATE_DISCONNECTED) { in usbgem_m_stop()
3128 (void) usbgem_mac_stop(dp, MAC_STATE_STOPPED, STOP_GRACEFUL); in usbgem_m_stop()
3130 rw_exit(&dp->dev_state_lock); in usbgem_m_stop()
3138 struct usbgem_dev *dp = arg; in usbgem_m_multicst() local
3140 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_multicst()
3142 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_multicst()
3144 ret = usbgem_add_multicast(dp, ep); in usbgem_m_multicst()
3146 ret = usbgem_remove_multicast(dp, ep); in usbgem_m_multicst()
3148 rw_exit(&dp->dev_state_lock); in usbgem_m_multicst()
3162 struct usbgem_dev *dp = arg; in usbgem_m_setpromisc() local
3164 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_setpromisc()
3166 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_setpromisc()
3168 sema_p(&dp->rxfilter_lock); in usbgem_m_setpromisc()
3170 dp->rxmode |= RXMODE_PROMISC; in usbgem_m_setpromisc()
3172 dp->rxmode &= ~RXMODE_PROMISC; in usbgem_m_setpromisc()
3176 if (dp->mac_state != MAC_STATE_DISCONNECTED) { in usbgem_m_setpromisc()
3177 if (usbgem_hal_set_rx_filter(dp) != USB_SUCCESS) { in usbgem_m_setpromisc()
3181 sema_v(&dp->rxfilter_lock); in usbgem_m_setpromisc()
3183 rw_exit(&dp->dev_state_lock); in usbgem_m_setpromisc()
3192 struct usbgem_dev *dp = arg; in usbgem_m_getstat() local
3193 struct usbgem_stats *gstp = &dp->stats; in usbgem_m_getstat()
3195 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_getstat()
3197 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_getstat()
3198 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_m_getstat()
3199 rw_exit(&dp->dev_state_lock); in usbgem_m_getstat()
3203 (void) usbgem_hal_get_stats(dp); in usbgem_m_getstat()
3204 rw_exit(&dp->dev_state_lock); in usbgem_m_getstat()
3208 val = usbgem_speed_value[dp->speed] *1000000ull; in usbgem_m_getstat()
3320 val = dp->mii_phy_addr; in usbgem_m_getstat()
3324 val = dp->mii_phy_id; in usbgem_m_getstat()
3328 val = usbgem_mac_xcvr_inuse(dp); in usbgem_m_getstat()
3332 val = (dp->mii_xstatus & MII_XSTATUS_1000BASET_FD) || in usbgem_m_getstat()
3333 (dp->mii_xstatus & MII_XSTATUS_1000BASEX_FD); in usbgem_m_getstat()
3337 val = (dp->mii_xstatus & MII_XSTATUS_1000BASET) || in usbgem_m_getstat()
3338 (dp->mii_xstatus & MII_XSTATUS_1000BASEX); in usbgem_m_getstat()
3342 val = BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX_FD); in usbgem_m_getstat()
3346 val = BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX); in usbgem_m_getstat()
3350 val = BOOLEAN(dp->mii_status & MII_STATUS_10_FD); in usbgem_m_getstat()
3354 val = BOOLEAN(dp->mii_status & MII_STATUS_10); in usbgem_m_getstat()
3358 val = dp->ugc.usbgc_flow_control > FLOW_CONTROL_SYMMETRIC; in usbgem_m_getstat()
3362 val = dp->ugc.usbgc_flow_control != FLOW_CONTROL_NONE; in usbgem_m_getstat()
3366 val = BOOLEAN(dp->mii_status & MII_STATUS_CANAUTONEG); in usbgem_m_getstat()
3370 val = dp->anadv_1000fdx; in usbgem_m_getstat()
3374 val = dp->anadv_1000hdx; in usbgem_m_getstat()
3378 val = dp->anadv_100fdx; in usbgem_m_getstat()
3382 val = dp->anadv_100hdx; in usbgem_m_getstat()
3386 val = dp->anadv_10fdx; in usbgem_m_getstat()
3390 val = dp->anadv_10hdx; in usbgem_m_getstat()
3394 val = dp->anadv_asmpause; in usbgem_m_getstat()
3398 val = dp->anadv_pause; in usbgem_m_getstat()
3402 val = dp->anadv_autoneg; in usbgem_m_getstat()
3406 val = BOOLEAN(dp->mii_stat1000 & MII_1000TS_LP_FULL); in usbgem_m_getstat()
3410 val = BOOLEAN(dp->mii_stat1000 & MII_1000TS_LP_HALF); in usbgem_m_getstat()
3414 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_100BASE_TX_FD); in usbgem_m_getstat()
3418 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_100BASE_TX); in usbgem_m_getstat()
3422 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_10BASE_T_FD); in usbgem_m_getstat()
3426 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_10BASE_T); in usbgem_m_getstat()
3430 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_ASM_DIR); in usbgem_m_getstat()
3434 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_PAUSE); in usbgem_m_getstat()
3438 val = BOOLEAN(dp->mii_exp & MII_AN_EXP_LPCANAN); in usbgem_m_getstat()
3442 val = BOOLEAN(dp->flow_control & 2); in usbgem_m_getstat()
3446 val = BOOLEAN(dp->flow_control & 1); in usbgem_m_getstat()
3450 val = dp->anadv_autoneg && in usbgem_m_getstat()
3451 BOOLEAN(dp->mii_exp & MII_AN_EXP_LPCANAN); in usbgem_m_getstat()
3455 val = (dp->mii_state == MII_STATE_LINKUP) ? in usbgem_m_getstat()
3456 (dp->full_duplex ? 2 : 1) : 0; in usbgem_m_getstat()
3468 val = dp->anadv_remfault; in usbgem_m_getstat()
3472 val = BOOLEAN(dp->mii_lpable & MII_AN_ADVERT_REMFAULT); in usbgem_m_getstat()
3480 val = BOOLEAN(dp->mii_status & MII_STATUS_100_BASE_T4); in usbgem_m_getstat()
3484 val = dp->anadv_100t4; in usbgem_m_getstat()
3488 val = BOOLEAN(dp->mii_lpable & MII_ABILITY_100BASE_T4); in usbgem_m_getstat()
3510 struct usbgem_dev *dp = arg; in usbgem_m_unicst() local
3512 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_unicst()
3514 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_unicst()
3516 sema_p(&dp->rxfilter_lock); in usbgem_m_unicst()
3517 bcopy(mac, dp->cur_addr.ether_addr_octet, ETHERADDRL); in usbgem_m_unicst()
3518 dp->rxmode |= RXMODE_ENABLE; in usbgem_m_unicst()
3521 if (dp->mac_state != MAC_STATE_DISCONNECTED) { in usbgem_m_unicst()
3522 if (usbgem_hal_set_rx_filter(dp) != USB_SUCCESS) { in usbgem_m_unicst()
3526 sema_v(&dp->rxfilter_lock); in usbgem_m_unicst()
3527 rw_exit(&dp->dev_state_lock); in usbgem_m_unicst()
3541 struct usbgem_dev *dp = arg; in usbgem_m_tx() local
3543 DPRINTF(4, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_m_tx()
3547 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_tx()
3549 if (dp->mii_state != MII_STATE_LINKUP || in usbgem_m_tx()
3550 dp->mac_state != MAC_STATE_ONLINE) { in usbgem_m_tx()
3560 ASSERT(dp->nic_state == NIC_STATE_ONLINE); in usbgem_m_tx()
3562 limit = dp->tx_max_packets; in usbgem_m_tx()
3566 if (usbgem_send_common(dp, mp, in usbgem_m_tx()
3575 mutex_enter(&dp->txlock); in usbgem_m_tx()
3576 dp->tx_max_packets = max(dp->tx_max_packets - 1, 1); in usbgem_m_tx()
3577 mutex_exit(&dp->txlock); in usbgem_m_tx()
3581 rw_exit(&dp->dev_state_lock); in usbgem_m_tx()
3589 struct usbgem_dev *dp = arg; in usbgem_m_ioctl() local
3594 rw_enter(&dp->dev_state_lock, RW_READER); in usbgem_m_ioctl()
3596 rw_exit(&dp->dev_state_lock); in usbgem_m_ioctl()
3600 usbgem_gld3_init(struct usbgem_dev *dp, mac_register_t *macp) in usbgem_gld3_init() argument
3603 macp->m_driver = dp; in usbgem_gld3_init()
3604 macp->m_dip = dp->dip; in usbgem_gld3_init()
3605 macp->m_src_addr = dp->dev_addr.ether_addr_octet; in usbgem_gld3_init()
3608 macp->m_max_sdu = dp->mtu; in usbgem_gld3_init()
3610 if (dp->misc_flag & USBGEM_VLAN) { in usbgem_gld3_init()
3621 usbgem_generate_macaddr(struct usbgem_dev *dp, uint8_t *mac) in usbgem_generate_macaddr() argument
3632 dp->name); in usbgem_generate_macaddr()
3640 if (dp->name[i] == 0) { in usbgem_generate_macaddr()
3643 key ^= dp->name[i]; in usbgem_generate_macaddr()
3645 key ^= ddi_get_instance(dp->dip); in usbgem_generate_macaddr()
3658 usbgem_get_mac_addr_conf(struct usbgem_dev *dp) in usbgem_get_mac_addr_conf() argument
3671 DPRINTF(3, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_get_mac_addr_conf()
3676 if ((ddi_prop_lookup_string(DDI_DEV_T_ANY, dp->dip, in usbgem_get_mac_addr_conf()
3719 usbgem_generate_macaddr(dp, mac); in usbgem_get_mac_addr_conf()
3722 dp->dev_addr.ether_addr_octet[i] = mac[i]; in usbgem_get_mac_addr_conf()
3730 dp->name, valstr); in usbgem_get_mac_addr_conf()
3737 usbgem_read_conf(struct usbgem_dev *dp) in usbgem_read_conf() argument
3741 DPRINTF(1, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_read_conf()
3746 dp->anadv_autoneg = usbgem_prop_get_int(dp, "adv_autoneg_cap", 1) != 0; in usbgem_read_conf()
3747 dp->anadv_1000fdx = usbgem_prop_get_int(dp, "adv_1000fdx_cap", 1) != 0; in usbgem_read_conf()
3748 dp->anadv_1000hdx = usbgem_prop_get_int(dp, "adv_1000hdx_cap", 1) != 0; in usbgem_read_conf()
3749 dp->anadv_100t4 = usbgem_prop_get_int(dp, "adv_100T4_cap", 1) != 0; in usbgem_read_conf()
3750 dp->anadv_100fdx = usbgem_prop_get_int(dp, "adv_100fdx_cap", 1) != 0; in usbgem_read_conf()
3751 dp->anadv_100hdx = usbgem_prop_get_int(dp, "adv_100hdx_cap", 1) != 0; in usbgem_read_conf()
3752 dp->anadv_10fdx = usbgem_prop_get_int(dp, "adv_10fdx_cap", 1) != 0; in usbgem_read_conf()
3753 dp->anadv_10hdx = usbgem_prop_get_int(dp, "adv_10hdx_cap", 1) != 0; in usbgem_read_conf()
3754 dp->anadv_1000t_ms = usbgem_prop_get_int(dp, "adv_1000t_ms", 0); in usbgem_read_conf()
3756 if ((ddi_prop_exists(DDI_DEV_T_ANY, dp->dip, in usbgem_read_conf()
3758 dp->full_duplex = in usbgem_read_conf()
3759 usbgem_prop_get_int(dp, "full-duplex", 1) != 0; in usbgem_read_conf()
3760 dp->anadv_autoneg = B_FALSE; in usbgem_read_conf()
3761 if (dp->full_duplex) { in usbgem_read_conf()
3762 dp->anadv_1000hdx = B_FALSE; in usbgem_read_conf()
3763 dp->anadv_100hdx = B_FALSE; in usbgem_read_conf()
3764 dp->anadv_10hdx = B_FALSE; in usbgem_read_conf()
3766 dp->anadv_1000fdx = B_FALSE; in usbgem_read_conf()
3767 dp->anadv_100fdx = B_FALSE; in usbgem_read_conf()
3768 dp->anadv_10fdx = B_FALSE; in usbgem_read_conf()
3772 if ((val = usbgem_prop_get_int(dp, "speed", 0)) > 0) { in usbgem_read_conf()
3773 dp->anadv_autoneg = B_FALSE; in usbgem_read_conf()
3776 dp->speed = USBGEM_SPD_1000; in usbgem_read_conf()
3777 dp->anadv_100t4 = B_FALSE; in usbgem_read_conf()
3778 dp->anadv_100fdx = B_FALSE; in usbgem_read_conf()
3779 dp->anadv_100hdx = B_FALSE; in usbgem_read_conf()
3780 dp->anadv_10fdx = B_FALSE; in usbgem_read_conf()
3781 dp->anadv_10hdx = B_FALSE; in usbgem_read_conf()
3784 dp->speed = USBGEM_SPD_100; in usbgem_read_conf()
3785 dp->anadv_1000fdx = B_FALSE; in usbgem_read_conf()
3786 dp->anadv_1000hdx = B_FALSE; in usbgem_read_conf()
3787 dp->anadv_10fdx = B_FALSE; in usbgem_read_conf()
3788 dp->anadv_10hdx = B_FALSE; in usbgem_read_conf()
3791 dp->speed = USBGEM_SPD_10; in usbgem_read_conf()
3792 dp->anadv_1000fdx = B_FALSE; in usbgem_read_conf()
3793 dp->anadv_1000hdx = B_FALSE; in usbgem_read_conf()
3794 dp->anadv_100t4 = B_FALSE; in usbgem_read_conf()
3795 dp->anadv_100fdx = B_FALSE; in usbgem_read_conf()
3796 dp->anadv_100hdx = B_FALSE; in usbgem_read_conf()
3801 dp->name, "speed", val); in usbgem_read_conf()
3802 dp->anadv_autoneg = B_TRUE; in usbgem_read_conf()
3806 val = usbgem_prop_get_int(dp, in usbgem_read_conf()
3807 "adv_pause", dp->ugc.usbgc_flow_control & 1); in usbgem_read_conf()
3808 val |= usbgem_prop_get_int(dp, in usbgem_read_conf()
3809 "adv_asmpause", BOOLEAN(dp->ugc.usbgc_flow_control & 2)) << 1; in usbgem_read_conf()
3813 dp->name, "flow-control", val); in usbgem_read_conf()
3815 val = min(val, dp->ugc.usbgc_flow_control); in usbgem_read_conf()
3817 dp->anadv_pause = BOOLEAN(val & 1); in usbgem_read_conf()
3818 dp->anadv_asmpause = BOOLEAN(val & 2); in usbgem_read_conf()
3820 dp->mtu = usbgem_prop_get_int(dp, "mtu", dp->mtu); in usbgem_read_conf()
3821 dp->txthr = usbgem_prop_get_int(dp, "txthr", dp->txthr); in usbgem_read_conf()
3822 dp->rxthr = usbgem_prop_get_int(dp, "rxthr", dp->rxthr); in usbgem_read_conf()
3823 dp->txmaxdma = usbgem_prop_get_int(dp, "txmaxdma", dp->txmaxdma); in usbgem_read_conf()
3824 dp->rxmaxdma = usbgem_prop_get_int(dp, "rxmaxdma", dp->rxmaxdma); in usbgem_read_conf()
3826 dp->poll_pkt_delay = in usbgem_read_conf()
3827 usbgem_prop_get_int(dp, "pkt_delay", dp->poll_pkt_delay); in usbgem_read_conf()
3829 dp->max_poll_interval[GEM_SPD_10] = in usbgem_read_conf()
3830 usbgem_prop_get_int(dp, "max_poll_interval_10", in usbgem_read_conf()
3831 dp->max_poll_interval[GEM_SPD_10]); in usbgem_read_conf()
3832 dp->max_poll_interval[GEM_SPD_100] = in usbgem_read_conf()
3833 usbgem_prop_get_int(dp, "max_poll_interval_100", in usbgem_read_conf()
3834 dp->max_poll_interval[GEM_SPD_100]); in usbgem_read_conf()
3835 dp->max_poll_interval[GEM_SPD_1000] = in usbgem_read_conf()
3836 usbgem_prop_get_int(dp, "max_poll_interval_1000", in usbgem_read_conf()
3837 dp->max_poll_interval[GEM_SPD_1000]); in usbgem_read_conf()
3839 dp->min_poll_interval[GEM_SPD_10] = in usbgem_read_conf()
3840 usbgem_prop_get_int(dp, "min_poll_interval_10", in usbgem_read_conf()
3841 dp->min_poll_interval[GEM_SPD_10]); in usbgem_read_conf()
3842 dp->min_poll_interval[GEM_SPD_100] = in usbgem_read_conf()
3843 usbgem_prop_get_int(dp, "min_poll_interval_100", in usbgem_read_conf()
3844 dp->min_poll_interval[GEM_SPD_100]); in usbgem_read_conf()
3845 dp->min_poll_interval[GEM_SPD_1000] = in usbgem_read_conf()
3846 usbgem_prop_get_int(dp, "min_poll_interval_1000", in usbgem_read_conf()
3847 dp->min_poll_interval[GEM_SPD_1000]); in usbgem_read_conf()
3856 usbgem_ctrl_out(struct usbgem_dev *dp, in usbgem_ctrl_out() argument
3871 dp->name, __func__, reqt, req, val, ix, len, bp, dp->nic_state)); in usbgem_ctrl_out()
3873 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_ctrl_out()
3898 ret = usb_pipe_ctrl_xfer_wait(DEFAULT_PIPE(dp), in usbgem_ctrl_out()
3909 dp->name, __func__, reqt, req, val, ix, len, in usbgem_ctrl_out()
3925 usbgem_ctrl_in(struct usbgem_dev *dp, in usbgem_ctrl_in() argument
3941 dp->name, __func__, reqt, req, val, ix, len, bp, dp->mac_state)); in usbgem_ctrl_in()
3943 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_ctrl_in()
3959 ret = usb_pipe_ctrl_xfer_wait(DEFAULT_PIPE(dp), &setup, &data, in usbgem_ctrl_in()
3972 dp->name, __func__, in usbgem_ctrl_in()
3989 usbgem_ctrl_out_val(struct usbgem_dev *dp, in usbgem_ctrl_out_val() argument
4008 return (usbgem_ctrl_out(dp, reqt, req, val, ix, len, buf, len)); in usbgem_ctrl_out_val()
4012 usbgem_ctrl_in_val(struct usbgem_dev *dp, in usbgem_ctrl_in_val() argument
4023 err = usbgem_ctrl_in(dp, reqt, req, val, ix, len, buf, len); in usbgem_ctrl_in_val()
4057 usbgem_open_pipes(struct usbgem_dev *dp) in usbgem_open_pipes() argument
4066 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_open_pipes()
4068 ifnum = dp->ugc.usbgc_ifnum; in usbgem_open_pipes()
4069 alt = dp->ugc.usbgc_alt; in usbgem_open_pipes()
4071 ep_tree_node = usb_lookup_ep_data(dp->dip, dp->reg_data, ifnum, alt, in usbgem_open_pipes()
4075 dp->name, __func__); in usbgem_open_pipes()
4078 dp->ep_bulkin = &ep_tree_node->ep_descr; in usbgem_open_pipes()
4080 ep_tree_node = usb_lookup_ep_data(dp->dip, dp->reg_data, ifnum, alt, in usbgem_open_pipes()
4084 dp->name, __func__); in usbgem_open_pipes()
4087 dp->ep_bulkout = &ep_tree_node->ep_descr; in usbgem_open_pipes()
4089 ep_tree_node = usb_lookup_ep_data(dp->dip, dp->reg_data, ifnum, alt, in usbgem_open_pipes()
4092 dp->ep_intr = &ep_tree_node->ep_descr; in usbgem_open_pipes()
4096 dp->name, __func__)); in usbgem_open_pipes()
4097 dp->ep_intr = NULL; in usbgem_open_pipes()
4103 bzero(&dp->policy_bulkout, sizeof (usb_pipe_policy_t)); in usbgem_open_pipes()
4104 dp->policy_bulkout.pp_max_async_reqs = 1; in usbgem_open_pipes()
4106 if ((ret = usb_pipe_open(dp->dip, in usbgem_open_pipes()
4107 dp->ep_bulkout, &dp->policy_bulkout, USB_FLAGS_SLEEP, in usbgem_open_pipes()
4108 &dp->bulkout_pipe)) != USB_SUCCESS) { in usbgem_open_pipes()
4111 dp->name, __func__, ret); in usbgem_open_pipes()
4112 dp->bulkout_pipe = NULL; in usbgem_open_pipes()
4116 dp->name, __func__)); in usbgem_open_pipes()
4119 bzero(&dp->policy_bulkin, sizeof (usb_pipe_policy_t)); in usbgem_open_pipes()
4120 dp->policy_bulkin.pp_max_async_reqs = 1; in usbgem_open_pipes()
4121 if ((ret = usb_pipe_open(dp->dip, in usbgem_open_pipes()
4122 dp->ep_bulkin, &dp->policy_bulkin, USB_FLAGS_SLEEP, in usbgem_open_pipes()
4123 &dp->bulkin_pipe)) != USB_SUCCESS) { in usbgem_open_pipes()
4126 dp->name, __func__, ret); in usbgem_open_pipes()
4127 dp->bulkin_pipe = NULL; in usbgem_open_pipes()
4131 dp->name, __func__)); in usbgem_open_pipes()
4133 if (dp->ep_intr) { in usbgem_open_pipes()
4135 bzero(&dp->policy_interrupt, sizeof (usb_pipe_policy_t)); in usbgem_open_pipes()
4136 dp->policy_interrupt.pp_max_async_reqs = 1; in usbgem_open_pipes()
4137 if ((ret = usb_pipe_open(dp->dip, dp->ep_intr, in usbgem_open_pipes()
4138 &dp->policy_interrupt, USB_FLAGS_SLEEP, in usbgem_open_pipes()
4139 &dp->intr_pipe)) != USB_SUCCESS) { in usbgem_open_pipes()
4142 dp->name, __func__, ret); in usbgem_open_pipes()
4143 dp->intr_pipe = NULL; in usbgem_open_pipes()
4148 dp->name, __func__)); in usbgem_open_pipes()
4153 if (dp->bulkin_pipe) { in usbgem_open_pipes()
4154 usb_pipe_close(dp->dip, in usbgem_open_pipes()
4155 dp->bulkin_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_open_pipes()
4156 dp->bulkin_pipe = NULL; in usbgem_open_pipes()
4158 if (dp->bulkout_pipe) { in usbgem_open_pipes()
4159 usb_pipe_close(dp->dip, in usbgem_open_pipes()
4160 dp->bulkout_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_open_pipes()
4161 dp->bulkout_pipe = NULL; in usbgem_open_pipes()
4163 if (dp->intr_pipe) { in usbgem_open_pipes()
4164 usb_pipe_close(dp->dip, in usbgem_open_pipes()
4165 dp->intr_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_open_pipes()
4166 dp->intr_pipe = NULL; in usbgem_open_pipes()
4173 usbgem_close_pipes(struct usbgem_dev *dp) in usbgem_close_pipes() argument
4175 DPRINTF(0, (CE_CONT, "!%s: %s: called", dp->name, __func__)); in usbgem_close_pipes()
4177 if (dp->intr_pipe) { in usbgem_close_pipes()
4178 usb_pipe_close(dp->dip, in usbgem_close_pipes()
4179 dp->intr_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_close_pipes()
4180 dp->intr_pipe = NULL; in usbgem_close_pipes()
4182 DPRINTF(1, (CE_CONT, "!%s: %s: 1", dp->name, __func__)); in usbgem_close_pipes()
4184 ASSERT(dp->bulkin_pipe); in usbgem_close_pipes()
4185 usb_pipe_close(dp->dip, dp->bulkin_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_close_pipes()
4186 dp->bulkin_pipe = NULL; in usbgem_close_pipes()
4187 DPRINTF(1, (CE_CONT, "!%s: %s: 2", dp->name, __func__)); in usbgem_close_pipes()
4189 ASSERT(dp->bulkout_pipe); in usbgem_close_pipes()
4190 usb_pipe_close(dp->dip, dp->bulkout_pipe, USB_FLAGS_SLEEP, NULL, 0); in usbgem_close_pipes()
4191 dp->bulkout_pipe = NULL; in usbgem_close_pipes()
4192 DPRINTF(1, (CE_CONT, "!%s: %s: 3", dp->name, __func__)); in usbgem_close_pipes()
4200 usbgem_freeze_device(struct usbgem_dev *dp, boolean_t graceful) in usbgem_freeze_device() argument
4202 DPRINTF(0, (CE_NOTE, "!%s: %s: called", dp->name, __func__)); in usbgem_freeze_device()
4205 (void) usbgem_mac_stop(dp, MAC_STATE_DISCONNECTED, graceful); in usbgem_freeze_device()
4212 (void) usbgem_free_memory(dp); in usbgem_freeze_device()
4221 struct usbgem_dev *dp; in usbgem_disconnect_cb() local
4223 dp = USBGEM_GET_DEV(dip); in usbgem_disconnect_cb()
4226 dp->name, (void *)dp); in usbgem_disconnect_cb()
4229 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_disconnect_cb()
4231 ret = usbgem_freeze_device(dp, 0); in usbgem_disconnect_cb()
4234 rw_exit(&dp->dev_state_lock); in usbgem_disconnect_cb()
4240 usbgem_recover_device(struct usbgem_dev *dp) in usbgem_recover_device() argument
4244 DPRINTF(0, (CE_NOTE, "!%s: %s: called", dp->name, __func__)); in usbgem_recover_device()
4249 usbgem_close_pipes(dp); in usbgem_recover_device()
4250 if ((err = usbgem_open_pipes(dp)) != USB_SUCCESS) { in usbgem_recover_device()
4255 dp->mac_state = MAC_STATE_STOPPED; in usbgem_recover_device()
4256 dp->mii_state = MII_STATE_UNKNOWN; in usbgem_recover_device()
4259 if ((err = usbgem_alloc_memory(dp)) != USB_SUCCESS) { in usbgem_recover_device()
4264 (void) usbgem_restart_nic(dp); in usbgem_recover_device()
4266 usbgem_mii_init(dp); in usbgem_recover_device()
4269 cv_signal(&dp->link_watcher_wait_cv); in usbgem_recover_device()
4278 struct usbgem_dev *dp; in usbgem_reconnect_cb() local
4280 dp = USBGEM_GET_DEV(dip); in usbgem_reconnect_cb()
4281 DPRINTF(0, (CE_CONT, "!%s: dp=%p", ddi_get_name(dip), dp)); in usbgem_reconnect_cb()
4284 if (usb_check_same_device(dp->dip, NULL, USB_LOG_L2, -1, in usbgem_reconnect_cb()
4287 "!%s: no or different device installed", dp->name); in usbgem_reconnect_cb()
4291 cmn_err(CE_NOTE, "%s: the usb device was reconnected", dp->name); in usbgem_reconnect_cb()
4294 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_reconnect_cb()
4296 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_reconnect_cb()
4297 err = usbgem_recover_device(dp); in usbgem_reconnect_cb()
4301 rw_exit(&dp->dev_state_lock); in usbgem_reconnect_cb()
4310 struct usbgem_dev *dp; in usbgem_suspend() local
4312 dp = USBGEM_GET_DEV(dip); in usbgem_suspend()
4314 DPRINTF(0, (CE_CONT, "!%s: %s: callded", dp->name, __func__)); in usbgem_suspend()
4317 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_suspend()
4319 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_suspend()
4320 err = usbgem_freeze_device(dp, STOP_GRACEFUL); in usbgem_suspend()
4324 rw_exit(&dp->dev_state_lock); in usbgem_suspend()
4333 struct usbgem_dev *dp; in usbgem_resume() local
4335 dp = USBGEM_GET_DEV(dip); in usbgem_resume()
4337 DPRINTF(0, (CE_CONT, "!%s: %s: callded", dp->name, __func__)); in usbgem_resume()
4340 if (usb_check_same_device(dp->dip, NULL, USB_LOG_L2, -1, in usbgem_resume()
4343 "!%s: no or different device installed", dp->name); in usbgem_resume()
4348 rw_enter(&dp->dev_state_lock, RW_WRITER); in usbgem_resume()
4350 if (dp->mac_state == MAC_STATE_DISCONNECTED) { in usbgem_resume()
4351 err = usbgem_recover_device(dp); in usbgem_resume()
4355 rw_exit(&dp->dev_state_lock); in usbgem_resume()
4367 struct usbgem_dev *dp; in usbgem_do_attach() local
4381 dp = kmem_zalloc(USBGEM_LOCAL_DATA_SIZE(gc), KM_SLEEP); in usbgem_do_attach()
4382 if (dp == NULL) { in usbgem_do_attach()
4393 dp->private = lp; in usbgem_do_attach()
4394 dp->priv_size = lmsize; in usbgem_do_attach()
4395 dp->mc_list = (struct mcast_addr *)&dp[1]; in usbgem_do_attach()
4397 dp->dip = dip; in usbgem_do_attach()
4398 bcopy(gc->usbgc_name, dp->name, USBGEM_NAME_LEN); in usbgem_do_attach()
4406 dp->name, __func__); in usbgem_do_attach()
4410 if (usb_get_dev_data(dip, &dp->reg_data, in usbgem_do_attach()
4412 dp->reg_data = NULL; in usbgem_do_attach()
4416 usb_print_descr_tree(dp->dip, dp->reg_data); in usbgem_do_attach()
4419 if (usbgem_open_pipes(dp) != USB_SUCCESS) { in usbgem_do_attach()
4422 dp->name, __func__); in usbgem_do_attach()
4429 mutex_init(&dp->rxlock, NULL, MUTEX_DRIVER, NULL); in usbgem_do_attach()
4430 mutex_init(&dp->txlock, NULL, MUTEX_DRIVER, NULL); in usbgem_do_attach()
4431 cv_init(&dp->rx_drain_cv, NULL, CV_DRIVER, NULL); in usbgem_do_attach()
4432 cv_init(&dp->tx_drain_cv, NULL, CV_DRIVER, NULL); in usbgem_do_attach()
4433 rw_init(&dp->dev_state_lock, NULL, RW_DRIVER, NULL); in usbgem_do_attach()
4434 mutex_init(&dp->link_watcher_lock, NULL, MUTEX_DRIVER, NULL); in usbgem_do_attach()
4435 cv_init(&dp->link_watcher_wait_cv, NULL, CV_DRIVER, NULL); in usbgem_do_attach()
4436 sema_init(&dp->hal_op_lock, 1, NULL, SEMA_DRIVER, NULL); in usbgem_do_attach()
4437 sema_init(&dp->rxfilter_lock, 1, NULL, SEMA_DRIVER, NULL); in usbgem_do_attach()
4442 dp->ugc = *gc; in usbgem_do_attach()
4444 dp->mtu = ETHERMTU; in usbgem_do_attach()
4445 dp->rxmode = 0; in usbgem_do_attach()
4446 dp->speed = USBGEM_SPD_10; /* default is 10Mbps */ in usbgem_do_attach()
4447 dp->full_duplex = B_FALSE; /* default is half */ in usbgem_do_attach()
4448 dp->flow_control = FLOW_CONTROL_NONE; in usbgem_do_attach()
4450 dp->nic_state = NIC_STATE_STOPPED; in usbgem_do_attach()
4451 dp->mac_state = MAC_STATE_STOPPED; in usbgem_do_attach()
4452 dp->mii_state = MII_STATE_UNKNOWN; in usbgem_do_attach()
4455 dp->txthr = ETHERMAX; /* tx fifo threshoold */ in usbgem_do_attach()
4456 dp->txmaxdma = 16*4; /* tx max dma burst size */ in usbgem_do_attach()
4457 dp->rxthr = 128; /* rx fifo threshoold */ in usbgem_do_attach()
4458 dp->rxmaxdma = 16*4; /* rx max dma burst size */ in usbgem_do_attach()
4463 usbgem_read_conf(dp); in usbgem_do_attach()
4466 dp->rx_buf_len = MAXPKTBUF(dp) + dp->ugc.usbgc_rx_header_len; in usbgem_do_attach()
4471 if (usbgem_hal_reset_chip(dp) != USB_SUCCESS) { in usbgem_do_attach()
4474 dp->name, __func__); in usbgem_do_attach()
4481 if (usbgem_hal_attach_chip(dp) != USB_SUCCESS) { in usbgem_do_attach()
4484 dp->name, __func__); in usbgem_do_attach()
4489 if (usbgem_alloc_memory(dp) != USB_SUCCESS) { in usbgem_do_attach()
4495 dp->name, in usbgem_do_attach()
4496 dp->dev_addr.ether_addr_octet[0], in usbgem_do_attach()
4497 dp->dev_addr.ether_addr_octet[1], in usbgem_do_attach()
4498 dp->dev_addr.ether_addr_octet[2], in usbgem_do_attach()
4499 dp->dev_addr.ether_addr_octet[3], in usbgem_do_attach()
4500 dp->dev_addr.ether_addr_octet[4], in usbgem_do_attach()
4501 dp->dev_addr.ether_addr_octet[5])); in usbgem_do_attach()
4504 dp->cur_addr = dp->dev_addr; in usbgem_do_attach()
4507 dp->bulkout_timeout = in usbgem_do_attach()
4508 dp->ugc.usbgc_tx_timeout / drv_usectohz(1000*1000); in usbgem_do_attach()
4510 usbgem_gld3_init(dp, macp); in usbgem_do_attach()
4513 dp->mii_lpable = 0; in usbgem_do_attach()
4514 dp->mii_advert = 0; in usbgem_do_attach()
4515 dp->mii_exp = 0; in usbgem_do_attach()
4516 dp->mii_ctl1000 = 0; in usbgem_do_attach()
4517 dp->mii_stat1000 = 0; in usbgem_do_attach()
4519 dp->mii_status_ro = 0; in usbgem_do_attach()
4520 dp->mii_xstatus_ro = 0; in usbgem_do_attach()
4522 if (usbgem_mii_probe(dp) != USB_SUCCESS) { in usbgem_do_attach()
4524 dp->name, __func__); in usbgem_do_attach()
4529 dp->anadv_autoneg &= BOOLEAN(dp->mii_status & MII_STATUS_CANAUTONEG); in usbgem_do_attach()
4530 dp->anadv_1000fdx &= in usbgem_do_attach()
4531 BOOLEAN(dp->mii_xstatus & in usbgem_do_attach()
4533 dp->anadv_1000hdx &= in usbgem_do_attach()
4534 BOOLEAN(dp->mii_xstatus & in usbgem_do_attach()
4536 dp->anadv_100t4 &= BOOLEAN(dp->mii_status & MII_STATUS_100_BASE_T4); in usbgem_do_attach()
4537 dp->anadv_100fdx &= BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX_FD); in usbgem_do_attach()
4538 dp->anadv_100hdx &= BOOLEAN(dp->mii_status & MII_STATUS_100_BASEX); in usbgem_do_attach()
4539 dp->anadv_10fdx &= BOOLEAN(dp->mii_status & MII_STATUS_10_FD); in usbgem_do_attach()
4540 dp->anadv_10hdx &= BOOLEAN(dp->mii_status & MII_STATUS_10); in usbgem_do_attach()
4542 if (usbgem_mii_init(dp) != USB_SUCCESS) { in usbgem_do_attach()
4544 dp->name, __func__); in usbgem_do_attach()
4551 if (ret = mac_register(macp, &dp->mh)) { in usbgem_do_attach()
4553 dp->name, ret); in usbgem_do_attach()
4563 dp->name, __func__); in usbgem_do_attach()
4568 if (usbgem_mii_start(dp) != USB_SUCCESS) { in usbgem_do_attach()
4573 if (usbgem_tx_watcher_start(dp)) { in usbgem_do_attach()
4577 ddi_set_driver_private(dip, (caddr_t)dp); in usbgem_do_attach()
4579 DPRINTF(2, (CE_CONT, "!%s: %s: return: success", dp->name, __func__)); in usbgem_do_attach()
4581 return (dp); in usbgem_do_attach()
4584 usbgem_mii_stop(dp); in usbgem_do_attach()
4590 mac_unregister(dp->mh); in usbgem_do_attach()
4594 usbgem_free_memory(dp); in usbgem_do_attach()
4597 cv_destroy(&dp->tx_drain_cv); in usbgem_do_attach()
4598 cv_destroy(&dp->rx_drain_cv); in usbgem_do_attach()
4599 mutex_destroy(&dp->txlock); in usbgem_do_attach()
4600 mutex_destroy(&dp->rxlock); in usbgem_do_attach()
4601 rw_destroy(&dp->dev_state_lock); in usbgem_do_attach()
4602 mutex_destroy(&dp->link_watcher_lock); in usbgem_do_attach()
4603 cv_destroy(&dp->link_watcher_wait_cv); in usbgem_do_attach()
4604 sema_destroy(&dp->hal_op_lock); in usbgem_do_attach()
4605 sema_destroy(&dp->rxfilter_lock); in usbgem_do_attach()
4608 (void) usbgem_close_pipes(dp); in usbgem_do_attach()
4611 usb_client_detach(dp->dip, dp->reg_data); in usbgem_do_attach()
4618 kmem_free((caddr_t)dp, USBGEM_LOCAL_DATA_SIZE(gc)); in usbgem_do_attach()
4626 struct usbgem_dev *dp; in usbgem_do_detach() local
4628 dp = USBGEM_GET_DEV(dip); in usbgem_do_detach()
4631 if (mac_unregister(dp->mh) != DDI_SUCCESS) { in usbgem_do_detach()
4639 usbgem_tx_watcher_stop(dp); in usbgem_do_detach()
4642 usbgem_mii_stop(dp); in usbgem_do_detach()
4645 (void) usbgem_free_memory(dp); in usbgem_do_detach()
4646 (void) usbgem_close_pipes(dp); in usbgem_do_detach()
4647 usb_client_detach(dp->dip, dp->reg_data); in usbgem_do_detach()
4648 dp->reg_data = NULL; in usbgem_do_detach()
4651 mutex_destroy(&dp->txlock); in usbgem_do_detach()
4652 mutex_destroy(&dp->rxlock); in usbgem_do_detach()
4653 cv_destroy(&dp->tx_drain_cv); in usbgem_do_detach()
4654 cv_destroy(&dp->rx_drain_cv); in usbgem_do_detach()
4655 rw_destroy(&dp->dev_state_lock); in usbgem_do_detach()
4656 mutex_destroy(&dp->link_watcher_lock); in usbgem_do_detach()
4657 cv_destroy(&dp->link_watcher_wait_cv); in usbgem_do_detach()
4658 sema_destroy(&dp->hal_op_lock); in usbgem_do_detach()
4659 sema_destroy(&dp->rxfilter_lock); in usbgem_do_detach()
4662 kmem_free((caddr_t)(dp->private), dp->priv_size); in usbgem_do_detach()
4663 kmem_free((caddr_t)dp, USBGEM_LOCAL_DATA_SIZE(&dp->ugc)); in usbgem_do_detach()
4693 struct usbgem_dev *dp; in usbgem_quiesce() local
4695 dp = USBGEM_GET_DEV(dip); in usbgem_quiesce()
4697 ASSERT(dp != NULL); in usbgem_quiesce()
4699 if (dp->mac_state != MAC_STATE_DISCONNECTED && in usbgem_quiesce()
4700 dp->mac_state != MAC_STATE_STOPPED) { in usbgem_quiesce()
4701 if (usbgem_hal_stop_chip(dp) != USB_SUCCESS) { in usbgem_quiesce()
4702 (void) usbgem_hal_reset_chip(dp); in usbgem_quiesce()