4974 (uint_t (*)(caddr_t))gem_intr,
4975 (caddr_t)dp) != DDI_SUCCESS) {
4976 cmn_err(CE_WARN, "!%s: ddi_add_softintr failed",
4977 dp->name);
4978 goto err_unregister;
4979 }
4980 } else if ((dp->misc_flag & GEM_NOINTR) == 0) {
4981 if (ddi_add_intr(dip, 0, NULL, NULL,
4982 (uint_t (*)(caddr_t))gem_intr,
4983 (caddr_t)dp) != DDI_SUCCESS) {
4984 cmn_err(CE_WARN, "!%s: ddi_add_intr failed", dp->name);
4985 goto err_unregister;
4986 }
4987 } else {
4988 /*
4989 * Dont use interrupt.
4990 * schedule first call of gem_intr_watcher
4991 */
4992 dp->intr_watcher_id =
4993 timeout((void (*)(void *))gem_intr_watcher,
4994 (void *)dp, drv_usectohz(3*1000000));
4995 }
4996
4997 /* link this device to dev_info */
4998 dp->next = (struct gem_dev *)ddi_get_driver_private(dip);
4999 dp->port = port;
5000 ddi_set_driver_private(dip, (caddr_t)dp);
5001
5002 /* reset mii phy and start mii link watcher */
5003 gem_mii_start(dp);
5004
5005 DPRINTF(2, (CE_CONT, "!gem_do_attach: return: success"));
5006 return (dp);
5007
5008 err_unregister:
5009 (void) mac_unregister(dp->mh);
5010 err_release_stats:
5011 /* release NDD resources */
5012 gem_nd_cleanup(dp);
5013
5014 err_free_ring:
5187 if ((*dp->gc.gc_reset_chip)(dp) != GEM_SUCCESS) {
5188 cmn_err(CE_WARN, "%s: %s: failed to reset chip",
5189 dp->name, __func__);
5190 mutex_exit(&dp->intrlock);
5191 goto err;
5192 }
5193 mutex_exit(&dp->intrlock);
5194
5195 /* initialize mii phy because we are just after power up */
5196 if (dp->gc.gc_mii_init) {
5197 (void) (*dp->gc.gc_mii_init)(dp);
5198 }
5199
5200 if (dp->misc_flag & GEM_NOINTR) {
5201 /*
5202 * schedule first call of gem_intr_watcher
5203 * instead of interrupts.
5204 */
5205 dp->intr_watcher_id =
5206 timeout((void (*)(void *))gem_intr_watcher,
5207 (void *)dp, drv_usectohz(3*1000000));
5208 }
5209
5210 /* restart mii link watcher */
5211 gem_mii_start(dp);
5212
5213 /* restart mac */
5214 mutex_enter(&dp->intrlock);
5215
5216 if (gem_mac_init(dp) != GEM_SUCCESS) {
5217 mutex_exit(&dp->intrlock);
5218 goto err_reset;
5219 }
5220 dp->nic_state = NIC_STATE_INITIALIZED;
5221
5222 /* setup media mode if the link have been up */
5223 if (dp->mii_state == MII_STATE_LINKUP) {
5224 if ((dp->gc.gc_set_media)(dp) != GEM_SUCCESS) {
5225 mutex_exit(&dp->intrlock);
5226 goto err_reset;
5227 }
|
4974 (uint_t (*)(caddr_t))gem_intr,
4975 (caddr_t)dp) != DDI_SUCCESS) {
4976 cmn_err(CE_WARN, "!%s: ddi_add_softintr failed",
4977 dp->name);
4978 goto err_unregister;
4979 }
4980 } else if ((dp->misc_flag & GEM_NOINTR) == 0) {
4981 if (ddi_add_intr(dip, 0, NULL, NULL,
4982 (uint_t (*)(caddr_t))gem_intr,
4983 (caddr_t)dp) != DDI_SUCCESS) {
4984 cmn_err(CE_WARN, "!%s: ddi_add_intr failed", dp->name);
4985 goto err_unregister;
4986 }
4987 } else {
4988 /*
4989 * Dont use interrupt.
4990 * schedule first call of gem_intr_watcher
4991 */
4992 dp->intr_watcher_id =
4993 timeout((void (*)(void *))gem_intr_watcher,
4994 (void *)dp, drv_sectohz(3));
4995 }
4996
4997 /* link this device to dev_info */
4998 dp->next = (struct gem_dev *)ddi_get_driver_private(dip);
4999 dp->port = port;
5000 ddi_set_driver_private(dip, (caddr_t)dp);
5001
5002 /* reset mii phy and start mii link watcher */
5003 gem_mii_start(dp);
5004
5005 DPRINTF(2, (CE_CONT, "!gem_do_attach: return: success"));
5006 return (dp);
5007
5008 err_unregister:
5009 (void) mac_unregister(dp->mh);
5010 err_release_stats:
5011 /* release NDD resources */
5012 gem_nd_cleanup(dp);
5013
5014 err_free_ring:
5187 if ((*dp->gc.gc_reset_chip)(dp) != GEM_SUCCESS) {
5188 cmn_err(CE_WARN, "%s: %s: failed to reset chip",
5189 dp->name, __func__);
5190 mutex_exit(&dp->intrlock);
5191 goto err;
5192 }
5193 mutex_exit(&dp->intrlock);
5194
5195 /* initialize mii phy because we are just after power up */
5196 if (dp->gc.gc_mii_init) {
5197 (void) (*dp->gc.gc_mii_init)(dp);
5198 }
5199
5200 if (dp->misc_flag & GEM_NOINTR) {
5201 /*
5202 * schedule first call of gem_intr_watcher
5203 * instead of interrupts.
5204 */
5205 dp->intr_watcher_id =
5206 timeout((void (*)(void *))gem_intr_watcher,
5207 (void *)dp, drv_sectohz(3));
5208 }
5209
5210 /* restart mii link watcher */
5211 gem_mii_start(dp);
5212
5213 /* restart mac */
5214 mutex_enter(&dp->intrlock);
5215
5216 if (gem_mac_init(dp) != GEM_SUCCESS) {
5217 mutex_exit(&dp->intrlock);
5218 goto err_reset;
5219 }
5220 dp->nic_state = NIC_STATE_INITIALIZED;
5221
5222 /* setup media mode if the link have been up */
5223 if (dp->mii_state == MII_STATE_LINKUP) {
5224 if ((dp->gc.gc_set_media)(dp) != GEM_SUCCESS) {
5225 mutex_exit(&dp->intrlock);
5226 goto err_reset;
5227 }
|