239 case DDI_MODEL_ILP32:
240 if (ddi_copyin((void *)data, &setfw32,
241 sizeof (ufmtest_ioc_setfw32_t), mode) != 0)
242 return (EFAULT);
243 setfw.utsw_bufsz = setfw32.utsw_bufsz;
244 setfw.utsw_buf = (caddr_t)(uintptr_t)setfw32.utsw_buf;
245 break;
246 #endif /* _MULTI_DATAMODEL */
247 case DDI_MODEL_NONE:
248 default:
249 if (ddi_copyin((void *)data, &setfw,
250 sizeof (ufmtest_ioc_setfw_t), mode) != 0)
251 return (EFAULT);
252 }
253
254 if (ufmt.ufmt_nvl != NULL) {
255 nvlist_free(ufmt.ufmt_nvl);
256 ufmt.ufmt_nvl = NULL;
257 }
258
259 nvlbuf = kmem_zalloc(setfw.utsw_bufsz, KM_NOSLEEP | KM_NORMALPRI);
260 if (nvlbuf == NULL)
261 return (ENOMEM);
262
263 if (ddi_copyin(setfw.utsw_buf, nvlbuf, setfw.utsw_bufsz, mode) != 0) {
264 kmem_free(nvlbuf, setfw.utsw_bufsz);
265 return (EFAULT);
266 }
267
268 ret = nvlist_unpack(nvlbuf, setfw.utsw_bufsz, &ufmt.ufmt_nvl,
269 KM_NOSLEEP);
270 kmem_free(nvlbuf, setfw.utsw_bufsz);
271
272 if (ret != 0)
273 return (ret);
274
275 /*
276 * Notify the UFM subsystem that our firmware information has changed.
277 */
278 ddi_ufm_update(ufmt.ufmt_ufmh);
279
|
239 case DDI_MODEL_ILP32:
240 if (ddi_copyin((void *)data, &setfw32,
241 sizeof (ufmtest_ioc_setfw32_t), mode) != 0)
242 return (EFAULT);
243 setfw.utsw_bufsz = setfw32.utsw_bufsz;
244 setfw.utsw_buf = (caddr_t)(uintptr_t)setfw32.utsw_buf;
245 break;
246 #endif /* _MULTI_DATAMODEL */
247 case DDI_MODEL_NONE:
248 default:
249 if (ddi_copyin((void *)data, &setfw,
250 sizeof (ufmtest_ioc_setfw_t), mode) != 0)
251 return (EFAULT);
252 }
253
254 if (ufmt.ufmt_nvl != NULL) {
255 nvlist_free(ufmt.ufmt_nvl);
256 ufmt.ufmt_nvl = NULL;
257 }
258
259 nvlbuf = kmem_zalloc(setfw.utsw_bufsz, KM_NOSLEEP_LAZY);
260 if (nvlbuf == NULL)
261 return (ENOMEM);
262
263 if (ddi_copyin(setfw.utsw_buf, nvlbuf, setfw.utsw_bufsz, mode) != 0) {
264 kmem_free(nvlbuf, setfw.utsw_bufsz);
265 return (EFAULT);
266 }
267
268 ret = nvlist_unpack(nvlbuf, setfw.utsw_bufsz, &ufmt.ufmt_nvl,
269 KM_NOSLEEP);
270 kmem_free(nvlbuf, setfw.utsw_bufsz);
271
272 if (ret != 0)
273 return (ret);
274
275 /*
276 * Notify the UFM subsystem that our firmware information has changed.
277 */
278 ddi_ufm_update(ufmt.ufmt_ufmh);
279
|