211 return (DDI_FAILURE);
212 }
213
214 if (ddi_soft_state_zalloc(av1394_statep, instance) != 0) {
215 TNF_PROBE_0(av1394_attach_error_soft_state_zalloc,
216 AV1394_TNF_INST_ERROR, "");
217 AV1394_TNF_EXIT(av1394_attach);
218 return (DDI_FAILURE);
219 }
220 avp = AV1394_INST2STATE(instance);
221
222 if (av1394_t1394_attach(avp, dip) != DDI_SUCCESS) {
223 av1394_cleanup(avp, 1);
224 AV1394_TNF_EXIT(av1394_attach);
225 return (DDI_FAILURE);
226 }
227
228 mutex_init(&avp->av_mutex, NULL, MUTEX_DRIVER,
229 avp->av_attachinfo.iblock_cookie);
230
231 #ifndef __lock_lint
232 avp->av_dip = dip;
233 avp->av_instance = instance;
234 #endif
235
236 if (av1394_add_events(avp) != DDI_SUCCESS) {
237 av1394_cleanup(avp, 2);
238 AV1394_TNF_EXIT(av1394_attach);
239 return (DDI_FAILURE);
240 }
241
242 if (av1394_isoch_attach(avp) != DDI_SUCCESS) {
243 av1394_cleanup(avp, 3);
244 AV1394_TNF_EXIT(av1394_attach);
245 return (DDI_FAILURE);
246 }
247
248 if (av1394_async_attach(avp) != DDI_SUCCESS) {
249 av1394_cleanup(avp, 4);
250 AV1394_TNF_EXIT(av1394_attach);
251 return (DDI_FAILURE);
252 }
253
254 #ifndef __lock_lint
255 avp->av_dev_state = AV1394_DEV_ONLINE;
256 #endif
257
258 ddi_report_dev(dip);
259
260 AV1394_TNF_EXIT(av1394_attach);
261 return (DDI_SUCCESS);
262 }
263
264 static int
265 av1394_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
266 {
267 int instance = ddi_get_instance(dip);
268 av1394_inst_t *avp;
269
270 AV1394_TNF_ENTER(av1394_detach);
271
272 if ((avp = AV1394_INST2STATE(instance)) == NULL) {
273 TNF_PROBE_0(av1394_detach_error_instance,
274 AV1394_TNF_INST_ERROR, "");
275 AV1394_TNF_EXIT(av1394_detach);
276 return (DDI_FAILURE);
|
211 return (DDI_FAILURE);
212 }
213
214 if (ddi_soft_state_zalloc(av1394_statep, instance) != 0) {
215 TNF_PROBE_0(av1394_attach_error_soft_state_zalloc,
216 AV1394_TNF_INST_ERROR, "");
217 AV1394_TNF_EXIT(av1394_attach);
218 return (DDI_FAILURE);
219 }
220 avp = AV1394_INST2STATE(instance);
221
222 if (av1394_t1394_attach(avp, dip) != DDI_SUCCESS) {
223 av1394_cleanup(avp, 1);
224 AV1394_TNF_EXIT(av1394_attach);
225 return (DDI_FAILURE);
226 }
227
228 mutex_init(&avp->av_mutex, NULL, MUTEX_DRIVER,
229 avp->av_attachinfo.iblock_cookie);
230
231 avp->av_dip = dip;
232 avp->av_instance = instance;
233
234 if (av1394_add_events(avp) != DDI_SUCCESS) {
235 av1394_cleanup(avp, 2);
236 AV1394_TNF_EXIT(av1394_attach);
237 return (DDI_FAILURE);
238 }
239
240 if (av1394_isoch_attach(avp) != DDI_SUCCESS) {
241 av1394_cleanup(avp, 3);
242 AV1394_TNF_EXIT(av1394_attach);
243 return (DDI_FAILURE);
244 }
245
246 if (av1394_async_attach(avp) != DDI_SUCCESS) {
247 av1394_cleanup(avp, 4);
248 AV1394_TNF_EXIT(av1394_attach);
249 return (DDI_FAILURE);
250 }
251
252 avp->av_dev_state = AV1394_DEV_ONLINE;
253
254 ddi_report_dev(dip);
255
256 AV1394_TNF_EXIT(av1394_attach);
257 return (DDI_SUCCESS);
258 }
259
260 static int
261 av1394_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
262 {
263 int instance = ddi_get_instance(dip);
264 av1394_inst_t *avp;
265
266 AV1394_TNF_ENTER(av1394_detach);
267
268 if ((avp = AV1394_INST2STATE(instance)) == NULL) {
269 TNF_PROBE_0(av1394_detach_error_instance,
270 AV1394_TNF_INST_ERROR, "");
271 AV1394_TNF_EXIT(av1394_detach);
272 return (DDI_FAILURE);
|