200 * Inputs: None.
201 *
202 * Returns: Returns the value returned by the ddi_softstate_init function
203 * on a failure to create the device state structure or the result
204 * of the module install routines.
205 *
206 */
207 int
208 _init(void)
209 {
210 int rval = 0;
211 int tgts = 0;
212
213 tgts |= 0x02;
214 tgts |= 0x08; /* In #ifdef NEXENTA block from original sTec drop. */
215
216 /*
217 * drv_usectohz() is a function, so can't initialize it at
218 * instantiation.
219 */
220 skd_timer_ticks = drv_usectohz(1000000);
221
222 Dcmn_err(CE_NOTE,
223 "<# Installing skd Driver dbg-lvl=%d %s %x>",
224 skd_dbg_level, DRV_BUILD_ID, tgts);
225
226 rval = ddi_soft_state_init(&skd_state, sizeof (skd_device_t), 0);
227 if (rval != DDI_SUCCESS)
228 return (rval);
229
230 bd_mod_init(&skd_dev_ops);
231
232 rval = mod_install(&modlinkage);
233 if (rval != DDI_SUCCESS) {
234 ddi_soft_state_fini(&skd_state);
235 bd_mod_fini(&skd_dev_ops);
236 }
237
238 return (rval);
239 }
240
2876 Dcmn_err(CE_NOTE, "(%s): skd_stop_device not online no sync\n",
2877 skdev->name);
2878 goto stop_out;
2879 }
2880
2881 if (SKD_REQ_STATE_IDLE != skspcl->req.state) {
2882 Dcmn_err(CE_NOTE, "(%s): skd_stop_device no special\n",
2883 skdev->name);
2884 goto stop_out;
2885 }
2886
2887 skdev->state = SKD_DRVR_STATE_SYNCING;
2888 skdev->sync_done = 0;
2889
2890 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE);
2891
2892 secs = 10;
2893 mutex_enter(&skdev->skd_internalio_mutex);
2894 while (skdev->sync_done == 0) {
2895 cur_ticks = ddi_get_lbolt();
2896 tmo = cur_ticks + drv_usectohz(1000000 * secs);
2897 if (cv_timedwait(&skdev->cv_waitq,
2898 &skdev->skd_internalio_mutex, tmo) == -1) {
2899 /* Oops - timed out */
2900
2901 Dcmn_err(CE_NOTE, "stop_device - %d secs TMO", secs);
2902 }
2903 }
2904
2905 mutex_exit(&skdev->skd_internalio_mutex);
2906
2907 switch (skdev->sync_done) {
2908 case 0:
2909 Dcmn_err(CE_NOTE, "(%s): skd_stop_device no sync\n",
2910 skdev->name);
2911 break;
2912 case 1:
2913 Dcmn_err(CE_NOTE, "(%s): skd_stop_device sync done\n",
2914 skdev->name);
2915 break;
2916 default:
4503 *
4504 * Name: skd_wait_for_s1120, wait for device to finish
4505 * its initialization.
4506 *
4507 * Inputs: skdev - device state structure.
4508 *
4509 * Returns: DDI_SUCCESS or DDI_FAILURE.
4510 *
4511 */
4512 static int
4513 skd_wait_for_s1120(skd_device_t *skdev)
4514 {
4515 clock_t cur_ticks, tmo;
4516 int loop_cntr = 0;
4517 int rc = DDI_FAILURE;
4518
4519 mutex_enter(&skdev->skd_internalio_mutex);
4520
4521 while (skdev->gendisk_on == 0) {
4522 cur_ticks = ddi_get_lbolt();
4523 tmo = cur_ticks + drv_usectohz(MICROSEC);
4524 if (cv_timedwait(&skdev->cv_waitq,
4525 &skdev->skd_internalio_mutex, tmo) == -1) {
4526 /* Oops - timed out */
4527 if (loop_cntr++ > 10)
4528 break;
4529 }
4530 }
4531
4532 mutex_exit(&skdev->skd_internalio_mutex);
4533
4534 if (skdev->gendisk_on == 1)
4535 rc = DDI_SUCCESS;
4536
4537 return (rc);
4538 }
4539
4540 /*
4541 *
4542 * Name: skd_update_props, updates certain device properties.
4543 *
|
200 * Inputs: None.
201 *
202 * Returns: Returns the value returned by the ddi_softstate_init function
203 * on a failure to create the device state structure or the result
204 * of the module install routines.
205 *
206 */
207 int
208 _init(void)
209 {
210 int rval = 0;
211 int tgts = 0;
212
213 tgts |= 0x02;
214 tgts |= 0x08; /* In #ifdef NEXENTA block from original sTec drop. */
215
216 /*
217 * drv_usectohz() is a function, so can't initialize it at
218 * instantiation.
219 */
220 skd_timer_ticks = drv_sectohz(1);
221
222 Dcmn_err(CE_NOTE,
223 "<# Installing skd Driver dbg-lvl=%d %s %x>",
224 skd_dbg_level, DRV_BUILD_ID, tgts);
225
226 rval = ddi_soft_state_init(&skd_state, sizeof (skd_device_t), 0);
227 if (rval != DDI_SUCCESS)
228 return (rval);
229
230 bd_mod_init(&skd_dev_ops);
231
232 rval = mod_install(&modlinkage);
233 if (rval != DDI_SUCCESS) {
234 ddi_soft_state_fini(&skd_state);
235 bd_mod_fini(&skd_dev_ops);
236 }
237
238 return (rval);
239 }
240
2876 Dcmn_err(CE_NOTE, "(%s): skd_stop_device not online no sync\n",
2877 skdev->name);
2878 goto stop_out;
2879 }
2880
2881 if (SKD_REQ_STATE_IDLE != skspcl->req.state) {
2882 Dcmn_err(CE_NOTE, "(%s): skd_stop_device no special\n",
2883 skdev->name);
2884 goto stop_out;
2885 }
2886
2887 skdev->state = SKD_DRVR_STATE_SYNCING;
2888 skdev->sync_done = 0;
2889
2890 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE);
2891
2892 secs = 10;
2893 mutex_enter(&skdev->skd_internalio_mutex);
2894 while (skdev->sync_done == 0) {
2895 cur_ticks = ddi_get_lbolt();
2896 tmo = cur_ticks + drv_sectohz(secs);
2897 if (cv_timedwait(&skdev->cv_waitq,
2898 &skdev->skd_internalio_mutex, tmo) == -1) {
2899 /* Oops - timed out */
2900
2901 Dcmn_err(CE_NOTE, "stop_device - %d secs TMO", secs);
2902 }
2903 }
2904
2905 mutex_exit(&skdev->skd_internalio_mutex);
2906
2907 switch (skdev->sync_done) {
2908 case 0:
2909 Dcmn_err(CE_NOTE, "(%s): skd_stop_device no sync\n",
2910 skdev->name);
2911 break;
2912 case 1:
2913 Dcmn_err(CE_NOTE, "(%s): skd_stop_device sync done\n",
2914 skdev->name);
2915 break;
2916 default:
4503 *
4504 * Name: skd_wait_for_s1120, wait for device to finish
4505 * its initialization.
4506 *
4507 * Inputs: skdev - device state structure.
4508 *
4509 * Returns: DDI_SUCCESS or DDI_FAILURE.
4510 *
4511 */
4512 static int
4513 skd_wait_for_s1120(skd_device_t *skdev)
4514 {
4515 clock_t cur_ticks, tmo;
4516 int loop_cntr = 0;
4517 int rc = DDI_FAILURE;
4518
4519 mutex_enter(&skdev->skd_internalio_mutex);
4520
4521 while (skdev->gendisk_on == 0) {
4522 cur_ticks = ddi_get_lbolt();
4523 tmo = cur_ticks + drv_sectohz(1);
4524 if (cv_timedwait(&skdev->cv_waitq,
4525 &skdev->skd_internalio_mutex, tmo) == -1) {
4526 /* Oops - timed out */
4527 if (loop_cntr++ > 10)
4528 break;
4529 }
4530 }
4531
4532 mutex_exit(&skdev->skd_internalio_mutex);
4533
4534 if (skdev->gendisk_on == 1)
4535 rc = DDI_SUCCESS;
4536
4537 return (rc);
4538 }
4539
4540 /*
4541 *
4542 * Name: skd_update_props, updates certain device properties.
4543 *
|