440 int ret;
441
442 ret = ddi_soft_state_init(&ahci_statep, sizeof (ahci_ctl_t), 0);
443 if (ret != 0) {
444 goto err_out;
445 }
446
447 #if AHCI_DEBUG
448 mutex_init(&ahci_log_mutex, NULL, MUTEX_DRIVER, NULL);
449 #endif
450
451 if ((ret = sata_hba_init(&modlinkage)) != 0) {
452 #if AHCI_DEBUG
453 mutex_destroy(&ahci_log_mutex);
454 #endif
455 ddi_soft_state_fini(&ahci_statep);
456 goto err_out;
457 }
458
459 /* watchdog tick */
460 ahci_watchdog_tick = drv_usectohz(
461 (clock_t)ahci_watchdog_timeout * 1000000);
462
463 ret = mod_install(&modlinkage);
464 if (ret != 0) {
465 sata_hba_fini(&modlinkage);
466 #if AHCI_DEBUG
467 mutex_destroy(&ahci_log_mutex);
468 #endif
469 ddi_soft_state_fini(&ahci_statep);
470 goto err_out;
471 }
472
473 return (ret);
474
475 err_out:
476 cmn_err(CE_WARN, "!ahci: Module init failed");
477 return (ret);
478 }
479
480 /*
481 * ahci module uninitialize.
1795 int pkt_timeout_ticks;
1796 uint32_t timeout_tags;
1797 int rval;
1798 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip);
1799 uint8_t port = addrp->aa_port;
1800
1801 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex));
1802
1803 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_do_sync_start enter: "
1804 "port %d:%d spkt 0x%p", port, addrp->aa_pmport, spkt);
1805
1806 if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
1807 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_POLLING;
1808 if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp,
1809 addrp, spkt)) == AHCI_FAILURE) {
1810 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_POLLING;
1811 return (rval);
1812 }
1813
1814 pkt_timeout_ticks =
1815 drv_usectohz((clock_t)spkt->satapkt_time * 1000000);
1816
1817 while (spkt->satapkt_reason == SATA_PKT_BUSY) {
1818 mutex_exit(&ahci_portp->ahciport_mutex);
1819
1820 /* Simulate the interrupt */
1821 ahci_port_intr(ahci_ctlp, ahci_portp, port);
1822
1823 drv_usecwait(AHCI_10MS_USECS);
1824
1825 mutex_enter(&ahci_portp->ahciport_mutex);
1826 pkt_timeout_ticks -= AHCI_10MS_TICKS;
1827 if (pkt_timeout_ticks < 0) {
1828 cmn_err(CE_WARN, "!ahci%d: ahci_do_sync_start "
1829 "port %d satapkt 0x%p timed out\n",
1830 instance, port, (void *)spkt);
1831 timeout_tags = (0x1 << rval);
1832 mutex_exit(&ahci_portp->ahciport_mutex);
1833 ahci_timeout_pkts(ahci_ctlp, ahci_portp,
1834 port, timeout_tags);
1835 mutex_enter(&ahci_portp->ahciport_mutex);
|
440 int ret;
441
442 ret = ddi_soft_state_init(&ahci_statep, sizeof (ahci_ctl_t), 0);
443 if (ret != 0) {
444 goto err_out;
445 }
446
447 #if AHCI_DEBUG
448 mutex_init(&ahci_log_mutex, NULL, MUTEX_DRIVER, NULL);
449 #endif
450
451 if ((ret = sata_hba_init(&modlinkage)) != 0) {
452 #if AHCI_DEBUG
453 mutex_destroy(&ahci_log_mutex);
454 #endif
455 ddi_soft_state_fini(&ahci_statep);
456 goto err_out;
457 }
458
459 /* watchdog tick */
460 ahci_watchdog_tick = drv_sectohz(ahci_watchdog_timeout);
461
462 ret = mod_install(&modlinkage);
463 if (ret != 0) {
464 sata_hba_fini(&modlinkage);
465 #if AHCI_DEBUG
466 mutex_destroy(&ahci_log_mutex);
467 #endif
468 ddi_soft_state_fini(&ahci_statep);
469 goto err_out;
470 }
471
472 return (ret);
473
474 err_out:
475 cmn_err(CE_WARN, "!ahci: Module init failed");
476 return (ret);
477 }
478
479 /*
480 * ahci module uninitialize.
1794 int pkt_timeout_ticks;
1795 uint32_t timeout_tags;
1796 int rval;
1797 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip);
1798 uint8_t port = addrp->aa_port;
1799
1800 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex));
1801
1802 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_do_sync_start enter: "
1803 "port %d:%d spkt 0x%p", port, addrp->aa_pmport, spkt);
1804
1805 if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
1806 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_POLLING;
1807 if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp,
1808 addrp, spkt)) == AHCI_FAILURE) {
1809 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_POLLING;
1810 return (rval);
1811 }
1812
1813 pkt_timeout_ticks =
1814 drv_sectohz((clock_t)spkt->satapkt_time);
1815
1816 while (spkt->satapkt_reason == SATA_PKT_BUSY) {
1817 mutex_exit(&ahci_portp->ahciport_mutex);
1818
1819 /* Simulate the interrupt */
1820 ahci_port_intr(ahci_ctlp, ahci_portp, port);
1821
1822 drv_usecwait(AHCI_10MS_USECS);
1823
1824 mutex_enter(&ahci_portp->ahciport_mutex);
1825 pkt_timeout_ticks -= AHCI_10MS_TICKS;
1826 if (pkt_timeout_ticks < 0) {
1827 cmn_err(CE_WARN, "!ahci%d: ahci_do_sync_start "
1828 "port %d satapkt 0x%p timed out\n",
1829 instance, port, (void *)spkt);
1830 timeout_tags = (0x1 << rval);
1831 mutex_exit(&ahci_portp->ahciport_mutex);
1832 ahci_timeout_pkts(ahci_ctlp, ahci_portp,
1833 port, timeout_tags);
1834 mutex_enter(&ahci_portp->ahciport_mutex);
|