16716431bSRobert Mustacchi /* 26716431bSRobert Mustacchi * usbgem.h: General USB to Ethernet MAC driver framework 36716431bSRobert Mustacchi * @(#)usbgem.h 1.4 12/02/09 46716431bSRobert Mustacchi * (C) Copyright 2003-2009 Masayuki Murayama KHF04453@nifty.ne.jp 56716431bSRobert Mustacchi */ 66716431bSRobert Mustacchi 76716431bSRobert Mustacchi #ifndef __USBGEM_H__ 86716431bSRobert Mustacchi #define __USBGEM_H__ 96716431bSRobert Mustacchi 106716431bSRobert Mustacchi #include <sys/mac.h> 116716431bSRobert Mustacchi #ifndef MAC_VERSION 126716431bSRobert Mustacchi #include <sys/mac_provider.h> 136716431bSRobert Mustacchi #endif 146716431bSRobert Mustacchi #include <sys/mac_ether.h> 156716431bSRobert Mustacchi 166716431bSRobert Mustacchi /* 176716431bSRobert Mustacchi * Useful macros and typedefs 186716431bSRobert Mustacchi */ 196716431bSRobert Mustacchi #define USBGEM_NAME_LEN 32 206716431bSRobert Mustacchi 216716431bSRobert Mustacchi #define USBGEM_TX_TIMEOUT (drv_usectohz(3*1000000)) 226716431bSRobert Mustacchi #define USBGEM_TX_TIMEOUT_INTERVAL (drv_usectohz(1*1000000)) 236716431bSRobert Mustacchi #define USBGEM_LINK_WATCH_INTERVAL (drv_usectohz(1*1000000)) 246716431bSRobert Mustacchi 256716431bSRobert Mustacchi /* general return code */ 266716431bSRobert Mustacchi #define USBGEM_SUCCESS 0 276716431bSRobert Mustacchi #define USBGEM_FAILURE 1 286716431bSRobert Mustacchi 296716431bSRobert Mustacchi /* return code of usbgem_tx_done */ 306716431bSRobert Mustacchi #define INTR_RESTART_TX 0x80000000U 316716431bSRobert Mustacchi 326716431bSRobert Mustacchi struct usbgem_stats { 336716431bSRobert Mustacchi uint32_t intr; 346716431bSRobert Mustacchi 356716431bSRobert Mustacchi uint32_t crc; 366716431bSRobert Mustacchi uint32_t errrcv; 376716431bSRobert Mustacchi uint32_t overflow; 386716431bSRobert Mustacchi uint32_t frame; 396716431bSRobert Mustacchi uint32_t missed; 406716431bSRobert Mustacchi uint32_t runt; 416716431bSRobert Mustacchi uint32_t frame_too_long; 426716431bSRobert Mustacchi uint32_t norcvbuf; 436716431bSRobert Mustacchi uint32_t sqe; 446716431bSRobert Mustacchi 456716431bSRobert Mustacchi uint32_t collisions; 466716431bSRobert Mustacchi uint32_t first_coll; 476716431bSRobert Mustacchi uint32_t multi_coll; 486716431bSRobert Mustacchi uint32_t excoll; 496716431bSRobert Mustacchi uint32_t xmit_internal_err; 506716431bSRobert Mustacchi uint32_t nocarrier; 516716431bSRobert Mustacchi uint32_t defer; 526716431bSRobert Mustacchi uint32_t errxmt; 536716431bSRobert Mustacchi uint32_t underflow; 546716431bSRobert Mustacchi uint32_t xmtlatecoll; 556716431bSRobert Mustacchi uint32_t noxmtbuf; 566716431bSRobert Mustacchi uint32_t jabber; 576716431bSRobert Mustacchi 586716431bSRobert Mustacchi 596716431bSRobert Mustacchi uint64_t rbytes; 606716431bSRobert Mustacchi uint64_t obytes; 616716431bSRobert Mustacchi uint64_t rpackets; 626716431bSRobert Mustacchi uint64_t opackets; 636716431bSRobert Mustacchi uint32_t rbcast; 646716431bSRobert Mustacchi uint32_t obcast; 656716431bSRobert Mustacchi uint32_t rmcast; 666716431bSRobert Mustacchi uint32_t omcast; 676716431bSRobert Mustacchi uint32_t rcv_internal_err; 686716431bSRobert Mustacchi }; 696716431bSRobert Mustacchi 706716431bSRobert Mustacchi struct mcast_addr { 716716431bSRobert Mustacchi struct ether_addr addr; 726716431bSRobert Mustacchi uint32_t hash; 736716431bSRobert Mustacchi }; 746716431bSRobert Mustacchi 756716431bSRobert Mustacchi #define USBGEM_MAXMC 64 766716431bSRobert Mustacchi #define USBGEM_MCALLOC (sizeof (struct mcast_addr) * USBGEM_MAXMC) 776716431bSRobert Mustacchi 786716431bSRobert Mustacchi #define SLOT(dp, n) ((n) % (dp)->ugc.usbgc_tx_list_max) 796716431bSRobert Mustacchi 806716431bSRobert Mustacchi /* 816716431bSRobert Mustacchi * mac soft state 826716431bSRobert Mustacchi */ 836716431bSRobert Mustacchi struct usbgem_dev { 846716431bSRobert Mustacchi dev_info_t *dip; 856716431bSRobert Mustacchi mac_handle_t mh; 866716431bSRobert Mustacchi char name[USBGEM_NAME_LEN]; 876716431bSRobert Mustacchi 886716431bSRobert Mustacchi /* pointer to usb private data */ 896716431bSRobert Mustacchi usb_client_dev_data_t *reg_data; 906716431bSRobert Mustacchi 916716431bSRobert Mustacchi /* usb handles */ 926716431bSRobert Mustacchi usb_pipe_handle_t default_pipe; 936716431bSRobert Mustacchi usb_pipe_handle_t bulkin_pipe; 946716431bSRobert Mustacchi usb_pipe_handle_t bulkout_pipe; 956716431bSRobert Mustacchi usb_pipe_handle_t intr_pipe; 966716431bSRobert Mustacchi 976716431bSRobert Mustacchi /* usb endpoints */ 986716431bSRobert Mustacchi usb_ep_descr_t *ep_default; 996716431bSRobert Mustacchi usb_ep_descr_t *ep_bulkin; 1006716431bSRobert Mustacchi usb_ep_descr_t *ep_bulkout; 1016716431bSRobert Mustacchi usb_ep_descr_t *ep_intr; 1026716431bSRobert Mustacchi 1036716431bSRobert Mustacchi /* usb policies */ 1046716431bSRobert Mustacchi usb_pipe_policy_t policy_default; 1056716431bSRobert Mustacchi usb_pipe_policy_t policy_bulkin; 1066716431bSRobert Mustacchi usb_pipe_policy_t policy_bulkout; 1076716431bSRobert Mustacchi usb_pipe_policy_t policy_interrupt; 1086716431bSRobert Mustacchi 1096716431bSRobert Mustacchi /* MAC address information */ 1106716431bSRobert Mustacchi struct ether_addr cur_addr; 1116716431bSRobert Mustacchi struct ether_addr dev_addr; 1126716431bSRobert Mustacchi 1136716431bSRobert Mustacchi /* RX state and resource management */ 1146716431bSRobert Mustacchi kmutex_t rxlock; 1156716431bSRobert Mustacchi int rx_busy_cnt; 1166716431bSRobert Mustacchi boolean_t rx_active; 1176716431bSRobert Mustacchi kcondvar_t rx_drain_cv; 1186716431bSRobert Mustacchi 1196716431bSRobert Mustacchi /* RX buffer management */ 1206716431bSRobert Mustacchi int rx_buf_len; 1216716431bSRobert Mustacchi 1226716431bSRobert Mustacchi /* TX state and resource management */ 1236716431bSRobert Mustacchi kmutex_t txlock; 1246716431bSRobert Mustacchi int tx_busy_cnt; 1256716431bSRobert Mustacchi usb_bulk_req_t *tx_free_list; 1266716431bSRobert Mustacchi kcondvar_t tx_drain_cv; 1276716431bSRobert Mustacchi clock_t tx_start_time; 1286716431bSRobert Mustacchi int bulkout_timeout; /* in second */ 1296716431bSRobert Mustacchi int tx_max_packets; 1306716431bSRobert Mustacchi int tx_seq_num; 1316716431bSRobert Mustacchi int tx_intr_pended; 1326716431bSRobert Mustacchi 1336716431bSRobert Mustacchi /* NIC state from OS view */ 1346716431bSRobert Mustacchi int nic_state; 1356716431bSRobert Mustacchi #define NIC_STATE_UNKNOWN 0 1366716431bSRobert Mustacchi #define NIC_STATE_STOPPED 1 1376716431bSRobert Mustacchi #define NIC_STATE_INITIALIZED 2 1386716431bSRobert Mustacchi #define NIC_STATE_ONLINE 3 1396716431bSRobert Mustacchi 1406716431bSRobert Mustacchi /* MAC state from hardware view */ 1416716431bSRobert Mustacchi int mac_state; 1426716431bSRobert Mustacchi #define MAC_STATE_DISCONNECTED 0 /* it includes suspended state too */ 1436716431bSRobert Mustacchi #define MAC_STATE_STOPPED 1 /* powered up / buf not initialized */ 1446716431bSRobert Mustacchi #define MAC_STATE_INITIALIZED 2 /* initialized */ 1456716431bSRobert Mustacchi #define MAC_STATE_ONLINE 3 /* working correctly */ 1466716431bSRobert Mustacchi #define MAC_STATE_ERROR 4 /* need to restart nic */ 1476716431bSRobert Mustacchi 1486716431bSRobert Mustacchi clock_t fatal_error; 1496716431bSRobert Mustacchi 1506716431bSRobert Mustacchi /* robustness: timer and watchdog */ 1516716431bSRobert Mustacchi uint_t tx_watcher_stop; 1526716431bSRobert Mustacchi kt_did_t tx_watcher_did; 1536716431bSRobert Mustacchi kcondvar_t tx_watcher_cv; 1546716431bSRobert Mustacchi kmutex_t tx_watcher_lock; 1556716431bSRobert Mustacchi clock_t tx_watcher_timeout; 1566716431bSRobert Mustacchi clock_t tx_watcher_interval; 1576716431bSRobert Mustacchi 1586716431bSRobert Mustacchi /* MII mamagement */ 1596716431bSRobert Mustacchi boolean_t anadv_autoneg:1; 1606716431bSRobert Mustacchi boolean_t anadv_1000fdx:1; 1616716431bSRobert Mustacchi boolean_t anadv_1000hdx:1; 1626716431bSRobert Mustacchi boolean_t anadv_100t4:1; 1636716431bSRobert Mustacchi boolean_t anadv_100fdx:1; 1646716431bSRobert Mustacchi boolean_t anadv_100hdx:1; 1656716431bSRobert Mustacchi boolean_t anadv_10fdx:1; 1666716431bSRobert Mustacchi boolean_t anadv_10hdx:1; 1676716431bSRobert Mustacchi boolean_t anadv_1000t_ms:2; 1686716431bSRobert Mustacchi boolean_t anadv_pause:1; 1696716431bSRobert Mustacchi boolean_t anadv_asmpause:1; 1706716431bSRobert Mustacchi boolean_t mii_advert_ro:1; 1716716431bSRobert Mustacchi 1726716431bSRobert Mustacchi boolean_t full_duplex:1; 1736716431bSRobert Mustacchi int speed:3; 1746716431bSRobert Mustacchi #define USBGEM_SPD_10 0 1756716431bSRobert Mustacchi #define USBGEM_SPD_100 1 1766716431bSRobert Mustacchi #define USBGEM_SPD_1000 2 1776716431bSRobert Mustacchi #define USBGEM_SPD_NUM 3 1786716431bSRobert Mustacchi unsigned int flow_control:2; 1796716431bSRobert Mustacchi #define FLOW_CONTROL_NONE 0 1806716431bSRobert Mustacchi #define FLOW_CONTROL_SYMMETRIC 1 1816716431bSRobert Mustacchi #define FLOW_CONTROL_TX_PAUSE 2 1826716431bSRobert Mustacchi #define FLOW_CONTROL_RX_PAUSE 3 1836716431bSRobert Mustacchi 1846716431bSRobert Mustacchi boolean_t mii_supress_msg:1; 1856716431bSRobert Mustacchi 1866716431bSRobert Mustacchi uint32_t mii_phy_id; 1876716431bSRobert Mustacchi uint16_t mii_status; 1886716431bSRobert Mustacchi uint16_t mii_advert; 1896716431bSRobert Mustacchi uint16_t mii_lpable; 1906716431bSRobert Mustacchi uint16_t mii_exp; 1916716431bSRobert Mustacchi uint16_t mii_ctl1000; 1926716431bSRobert Mustacchi uint16_t mii_stat1000; 1936716431bSRobert Mustacchi uint16_t mii_xstatus; 1946716431bSRobert Mustacchi int8_t mii_phy_addr; /* must be signed */ 1956716431bSRobert Mustacchi 1966716431bSRobert Mustacchi uint16_t mii_status_ro; 1976716431bSRobert Mustacchi uint16_t mii_xstatus_ro; 1986716431bSRobert Mustacchi 1996716431bSRobert Mustacchi int mii_state; 2006716431bSRobert Mustacchi #define MII_STATE_UNKNOWN 0 2016716431bSRobert Mustacchi #define MII_STATE_RESETTING 1 2026716431bSRobert Mustacchi #define MII_STATE_AUTONEGOTIATING 2 2036716431bSRobert Mustacchi #define MII_STATE_AN_DONE 3 2046716431bSRobert Mustacchi #define MII_STATE_MEDIA_SETUP 4 2056716431bSRobert Mustacchi #define MII_STATE_LINKUP 5 2066716431bSRobert Mustacchi #define MII_STATE_LINKDOWN 6 2076716431bSRobert Mustacchi 2086716431bSRobert Mustacchi clock_t mii_last_check; /* in tick */ 2096716431bSRobert Mustacchi clock_t mii_timer; /* in tick */ 2106716431bSRobert Mustacchi #define MII_RESET_TIMEOUT drv_usectohz(1000*1000) 2116716431bSRobert Mustacchi #define MII_AN_TIMEOUT drv_usectohz(5000*1000) 2126716431bSRobert Mustacchi #define MII_LINKDOWN_TIMEOUT drv_usectohz(10000*1000) 2136716431bSRobert Mustacchi 2146716431bSRobert Mustacchi clock_t mii_interval; /* in tick */ 2156716431bSRobert Mustacchi clock_t linkup_delay; /* in tick */ 2166716431bSRobert Mustacchi 2176716431bSRobert Mustacchi uint_t link_watcher_stop; 2186716431bSRobert Mustacchi kt_did_t link_watcher_did; 2196716431bSRobert Mustacchi kcondvar_t link_watcher_wait_cv; 2206716431bSRobert Mustacchi kmutex_t link_watcher_lock; 2216716431bSRobert Mustacchi 2226716431bSRobert Mustacchi krwlock_t dev_state_lock; /* mac_state and nic_state */ 2236716431bSRobert Mustacchi ksema_t hal_op_lock; /* serialize hw operations */ 2246716431bSRobert Mustacchi ksema_t drv_op_lock; /* hotplug op lock */ 2256716431bSRobert Mustacchi 2266716431bSRobert Mustacchi /* multcast list */ 2276716431bSRobert Mustacchi ksema_t rxfilter_lock; 2286716431bSRobert Mustacchi int mc_count; 2296716431bSRobert Mustacchi int mc_count_req; 2306716431bSRobert Mustacchi struct mcast_addr *mc_list; 2316716431bSRobert Mustacchi int rxmode; 2326716431bSRobert Mustacchi #define RXMODE_PROMISC 0x01 2336716431bSRobert Mustacchi #define RXMODE_ALLMULTI_REQ 0x02 2346716431bSRobert Mustacchi #define RXMODE_MULTI_OVF 0x04 2356716431bSRobert Mustacchi #define RXMODE_ENABLE 0x08 2366716431bSRobert Mustacchi #define RXMODE_ALLMULTI (RXMODE_ALLMULTI_REQ | RXMODE_MULTI_OVF) 2376716431bSRobert Mustacchi #define RXMODE_BITS \ 2386716431bSRobert Mustacchi "\020" \ 2396716431bSRobert Mustacchi "\004ENABLE" \ 2406716431bSRobert Mustacchi "\003MULTI_OVF" \ 2416716431bSRobert Mustacchi "\002ALLMULTI_REQ" \ 2426716431bSRobert Mustacchi "\001PROMISC" 2436716431bSRobert Mustacchi 2446716431bSRobert Mustacchi /* statistcs */ 2456716431bSRobert Mustacchi struct usbgem_stats stats; 2466716431bSRobert Mustacchi 2476716431bSRobert Mustacchi /* pointer to local structure */ 2486716431bSRobert Mustacchi void *private; 2496716431bSRobert Mustacchi int priv_size; 2506716431bSRobert Mustacchi 2516716431bSRobert Mustacchi /* configuration */ 2526716431bSRobert Mustacchi struct usbgem_conf { 2536716431bSRobert Mustacchi /* name */ 2546716431bSRobert Mustacchi char usbgc_name[USBGEM_NAME_LEN]; 2556716431bSRobert Mustacchi int usbgc_ppa; 2566716431bSRobert Mustacchi 2576716431bSRobert Mustacchi /* specification on usb */ 2586716431bSRobert Mustacchi int usbgc_ifnum; /* interface number */ 2596716431bSRobert Mustacchi int usbgc_alt; /* alternate */ 2606716431bSRobert Mustacchi 2616716431bSRobert Mustacchi /* specification on tx engine */ 2626716431bSRobert Mustacchi int usbgc_tx_list_max; 2636716431bSRobert Mustacchi 2646716431bSRobert Mustacchi /* specification on rx engine */ 2656716431bSRobert Mustacchi int usbgc_rx_header_len; 2666716431bSRobert Mustacchi int usbgc_rx_list_max; 2676716431bSRobert Mustacchi 2686716431bSRobert Mustacchi /* time out parameters */ 2696716431bSRobert Mustacchi clock_t usbgc_tx_timeout; 2706716431bSRobert Mustacchi clock_t usbgc_tx_timeout_interval; 2716716431bSRobert Mustacchi 2726716431bSRobert Mustacchi /* flow control */ 2736716431bSRobert Mustacchi int usbgc_flow_control; 2746716431bSRobert Mustacchi 2756716431bSRobert Mustacchi /* MII timeout parameters */ 2766716431bSRobert Mustacchi clock_t usbgc_mii_linkdown_timeout; 2776716431bSRobert Mustacchi clock_t usbgc_mii_link_watch_interval; 2786716431bSRobert Mustacchi clock_t usbgc_mii_reset_timeout; 2796716431bSRobert Mustacchi 2806716431bSRobert Mustacchi clock_t usbgc_mii_an_watch_interval; 2816716431bSRobert Mustacchi clock_t usbgc_mii_an_timeout; 2826716431bSRobert Mustacchi clock_t usbgc_mii_an_wait; 2836716431bSRobert Mustacchi clock_t usbgc_mii_an_delay; 2846716431bSRobert Mustacchi 2856716431bSRobert Mustacchi /* MII configuration */ 2866716431bSRobert Mustacchi int usbgc_mii_addr_min; 2876716431bSRobert Mustacchi int usbgc_mii_linkdown_action; 2886716431bSRobert Mustacchi int usbgc_mii_linkdown_timeout_action; 2896716431bSRobert Mustacchi #define MII_ACTION_NONE 0 2906716431bSRobert Mustacchi #define MII_ACTION_RESET 1 2916716431bSRobert Mustacchi #define MII_ACTION_RSA 2 2926716431bSRobert Mustacchi boolean_t usbgc_mii_dont_reset:1; 2936716431bSRobert Mustacchi boolean_t usbgc_mii_an_oneshot:1; 2946716431bSRobert Mustacchi boolean_t usbgc_mii_hw_link_detection:1; 2956716431bSRobert Mustacchi boolean_t usbgc_mii_stop_mac_on_linkdown:1; 2966716431bSRobert Mustacchi uint16_t usbgc_mii_an_cmd; 2976716431bSRobert Mustacchi 2986716431bSRobert Mustacchi /* I/O methods */ 2996716431bSRobert Mustacchi 3006716431bSRobert Mustacchi /* mac operation */ 3016716431bSRobert Mustacchi int (*usbgc_attach_chip)(struct usbgem_dev *dp); 3026716431bSRobert Mustacchi int (*usbgc_reset_chip)(struct usbgem_dev *dp); 3036716431bSRobert Mustacchi int (*usbgc_init_chip)(struct usbgem_dev *dp); 3046716431bSRobert Mustacchi int (*usbgc_start_chip)(struct usbgem_dev *dp); 3056716431bSRobert Mustacchi int (*usbgc_stop_chip)(struct usbgem_dev *dp); 3066716431bSRobert Mustacchi uint32_t (*usbgc_multicast_hash)(struct usbgem_dev *dp, 3076716431bSRobert Mustacchi const uint8_t *); 3086716431bSRobert Mustacchi int (*usbgc_set_rx_filter)(struct usbgem_dev *dp); 3096716431bSRobert Mustacchi int (*usbgc_set_media)(struct usbgem_dev *dp); 3106716431bSRobert Mustacchi int (*usbgc_get_stats)(struct usbgem_dev *dp); 3116716431bSRobert Mustacchi void (*usbgc_interrupt)(struct usbgem_dev *dp, mblk_t *mp); 3126716431bSRobert Mustacchi 3136716431bSRobert Mustacchi /* packet manipulation */ 3146716431bSRobert Mustacchi mblk_t *(*usbgc_tx_make_packet)(struct usbgem_dev *dp, 3156716431bSRobert Mustacchi mblk_t *mp); 3166716431bSRobert Mustacchi mblk_t *(*usbgc_rx_make_packet)(struct usbgem_dev *dp, 3176716431bSRobert Mustacchi mblk_t *mp); 3186716431bSRobert Mustacchi /* mii operations */ 3196716431bSRobert Mustacchi int (*usbgc_mii_probe)(struct usbgem_dev *dp); 3206716431bSRobert Mustacchi int (*usbgc_mii_init)(struct usbgem_dev *dp); 3216716431bSRobert Mustacchi int (*usbgc_mii_config)(struct usbgem_dev *dp, int *errp); 3226716431bSRobert Mustacchi uint16_t (*usbgc_mii_read)(struct usbgem_dev *dp, uint_t reg, 3236716431bSRobert Mustacchi int *errp); 3246716431bSRobert Mustacchi void (*usbgc_mii_write)(struct usbgem_dev *dp, uint_t reg, 3256716431bSRobert Mustacchi uint16_t val, int *errp); 3266716431bSRobert Mustacchi 3276716431bSRobert Mustacchi /* jumbo frame */ 3286716431bSRobert Mustacchi int usbgc_max_mtu; 3296716431bSRobert Mustacchi int usbgc_default_mtu; 3306716431bSRobert Mustacchi int usbgc_min_mtu; 3316716431bSRobert Mustacchi } ugc; 3326716431bSRobert Mustacchi 3336716431bSRobert Mustacchi int misc_flag; 3346716431bSRobert Mustacchi #define USBGEM_VLAN 0x0001 3356716431bSRobert Mustacchi timeout_id_t intr_watcher_id; 3366716431bSRobert Mustacchi 3376716431bSRobert Mustacchi /* buffer size */ 3386716431bSRobert Mustacchi uint_t mtu; 3396716431bSRobert Mustacchi 3406716431bSRobert Mustacchi /* performance tuning parameters */ 3416716431bSRobert Mustacchi uint_t txthr; /* tx fifo threshoold */ 3426716431bSRobert Mustacchi uint_t txmaxdma; /* tx max dma burst size */ 3436716431bSRobert Mustacchi uint_t rxthr; /* rx fifo threshoold */ 3446716431bSRobert Mustacchi uint_t rxmaxdma; /* tx max dma burst size */ 3456716431bSRobert Mustacchi 3466716431bSRobert Mustacchi /* kstat stuff */ 3476716431bSRobert Mustacchi kstat_t *ksp; 3486716431bSRobert Mustacchi 3496716431bSRobert Mustacchi /* ndd stuff */ 3506716431bSRobert Mustacchi caddr_t nd_data_p; 3516716431bSRobert Mustacchi caddr_t nd_arg_p; 3526716431bSRobert Mustacchi 3536716431bSRobert Mustacchi #ifdef USBGEM_DEBUG_LEVEL 3546716431bSRobert Mustacchi int tx_cnt; 3556716431bSRobert Mustacchi #endif 3566716431bSRobert Mustacchi }; 3576716431bSRobert Mustacchi 3586716431bSRobert Mustacchi /* 3596716431bSRobert Mustacchi * Exported functions 3606716431bSRobert Mustacchi */ 3616716431bSRobert Mustacchi int usbgem_ctrl_out(struct usbgem_dev *dp, 3626716431bSRobert Mustacchi uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len, 3636716431bSRobert Mustacchi void *bp, int size); 3646716431bSRobert Mustacchi 3656716431bSRobert Mustacchi int usbgem_ctrl_in(struct usbgem_dev *dp, 3666716431bSRobert Mustacchi uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len, 3676716431bSRobert Mustacchi void *bp, int size); 3686716431bSRobert Mustacchi 3696716431bSRobert Mustacchi int usbgem_ctrl_out_val(struct usbgem_dev *dp, 3706716431bSRobert Mustacchi uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len, 3716716431bSRobert Mustacchi uint32_t v); 3726716431bSRobert Mustacchi 3736716431bSRobert Mustacchi int usbgem_ctrl_in_val(struct usbgem_dev *dp, 3746716431bSRobert Mustacchi uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len, 3756716431bSRobert Mustacchi void *valp); 3766716431bSRobert Mustacchi 3776716431bSRobert Mustacchi void usbgem_generate_macaddr(struct usbgem_dev *, uint8_t *); 3786716431bSRobert Mustacchi boolean_t usbgem_get_mac_addr_conf(struct usbgem_dev *); 3796716431bSRobert Mustacchi int usbgem_mii_probe_default(struct usbgem_dev *); 3806716431bSRobert Mustacchi int usbgem_mii_init_default(struct usbgem_dev *); 3816716431bSRobert Mustacchi int usbgem_mii_config_default(struct usbgem_dev *, int *errp); 3826716431bSRobert Mustacchi void usbgem_mii_update_link(struct usbgem_dev *); 3836716431bSRobert Mustacchi void usbgem_restart_tx(struct usbgem_dev *); 3846716431bSRobert Mustacchi boolean_t usbgem_tx_done(struct usbgem_dev *, int); 3856716431bSRobert Mustacchi void usbgem_receive(struct usbgem_dev *); 3866716431bSRobert Mustacchi struct usbgem_dev *usbgem_do_attach(dev_info_t *, 3876716431bSRobert Mustacchi struct usbgem_conf *, void *, int); 3886716431bSRobert Mustacchi int usbgem_do_detach(dev_info_t *); 3896716431bSRobert Mustacchi 3906716431bSRobert Mustacchi uint32_t usbgem_ether_crc_le(const uint8_t *addr); 3916716431bSRobert Mustacchi uint32_t usbgem_ether_crc_be(const uint8_t *addr); 3926716431bSRobert Mustacchi 3936716431bSRobert Mustacchi int usbgem_resume(dev_info_t *); 3946716431bSRobert Mustacchi int usbgem_suspend(dev_info_t *); 3956716431bSRobert Mustacchi int usbgem_quiesce(dev_info_t *); 3966716431bSRobert Mustacchi 3976716431bSRobert Mustacchi #define USBGEM_STREAM_OPS(dev_ops, attach, detach) \ 3986716431bSRobert Mustacchi DDI_DEFINE_STREAM_OPS(dev_ops, nulldev, nulldev, attach, detach, \ 3996716431bSRobert Mustacchi nodev, NULL, D_MP, NULL, usbgem_quiesce) 400*ceb6b962SRobert Mustacchi 4016716431bSRobert Mustacchi int usbgem_mod_init(struct dev_ops *, char *); 4026716431bSRobert Mustacchi void usbgem_mod_fini(struct dev_ops *); 4036716431bSRobert Mustacchi 4046716431bSRobert Mustacchi #define USBGEM_GET_DEV(dip) \ 4056716431bSRobert Mustacchi ((struct usbgem_dev *)(ddi_get_driver_private(dip))) 4066716431bSRobert Mustacchi 4076716431bSRobert Mustacchi #endif /* __USBGEM_H__ */ 408