siis.c (206652) | siis.c (207431) |
---|---|
1/*- 2 * Copyright (c) 2009 Alexander Motin <mav@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2009 Alexander Motin <mav@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/dev/siis/siis.c 206652 2010-04-15 11:17:33Z mav $"); | 28__FBSDID("$FreeBSD: head/sys/dev/siis/siis.c 207431 2010-04-30 08:22:47Z mav $"); |
29 30#include <sys/param.h> 31#include <sys/module.h> 32#include <sys/systm.h> 33#include <sys/kernel.h> 34#include <sys/ata.h> 35#include <sys/bus.h> 36#include <sys/endian.h> --- 1568 unchanged lines hidden (view full) --- 1605 device_printf(ch->dev, "SATA connect time=%dms status=%08x\n", 1606 timeout, status); 1607 } 1608 /* Clear SATA error register */ 1609 ATA_OUTL(ch->r_mem, SIIS_P_SERR, 0xffffffff); 1610 return (1); 1611} 1612 | 29 30#include <sys/param.h> 31#include <sys/module.h> 32#include <sys/systm.h> 33#include <sys/kernel.h> 34#include <sys/ata.h> 35#include <sys/bus.h> 36#include <sys/endian.h> --- 1568 unchanged lines hidden (view full) --- 1605 device_printf(ch->dev, "SATA connect time=%dms status=%08x\n", 1606 timeout, status); 1607 } 1608 /* Clear SATA error register */ 1609 ATA_OUTL(ch->r_mem, SIIS_P_SERR, 0xffffffff); 1610 return (1); 1611} 1612 |
1613static int 1614siis_check_ids(device_t dev, union ccb *ccb) 1615{ 1616 1617 if (ccb->ccb_h.target_id > 15) { 1618 ccb->ccb_h.status = CAM_TID_INVALID; 1619 xpt_done(ccb); 1620 return (-1); 1621 } 1622 if (ccb->ccb_h.target_lun != 0) { 1623 ccb->ccb_h.status = CAM_LUN_INVALID; 1624 xpt_done(ccb); 1625 return (-1); 1626 } 1627 return (0); 1628} 1629 |
|
1613static void 1614siisaction(struct cam_sim *sim, union ccb *ccb) 1615{ 1616 device_t dev; 1617 struct siis_channel *ch; 1618 1619 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("siisaction func_code=%x\n", 1620 ccb->ccb_h.func_code)); 1621 1622 ch = (struct siis_channel *)cam_sim_softc(sim); 1623 dev = ch->dev; 1624 mtx_assert(&ch->mtx, MA_OWNED); 1625 switch (ccb->ccb_h.func_code) { 1626 /* Common cases first */ 1627 case XPT_ATA_IO: /* Execute the requested I/O operation */ 1628 case XPT_SCSI_IO: | 1630static void 1631siisaction(struct cam_sim *sim, union ccb *ccb) 1632{ 1633 device_t dev; 1634 struct siis_channel *ch; 1635 1636 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("siisaction func_code=%x\n", 1637 ccb->ccb_h.func_code)); 1638 1639 ch = (struct siis_channel *)cam_sim_softc(sim); 1640 dev = ch->dev; 1641 mtx_assert(&ch->mtx, MA_OWNED); 1642 switch (ccb->ccb_h.func_code) { 1643 /* Common cases first */ 1644 case XPT_ATA_IO: /* Execute the requested I/O operation */ 1645 case XPT_SCSI_IO: |
1629 if (ch->devices == 0) { | 1646 if (siis_check_ids(dev, ccb)) 1647 return; 1648 if (ch->devices == 0 || 1649 (ch->pm_present == 0 && 1650 ccb->ccb_h.target_id > 0 && ccb->ccb_h.target_id < 15)) { |
1630 ccb->ccb_h.status = CAM_SEL_TIMEOUT; | 1651 ccb->ccb_h.status = CAM_SEL_TIMEOUT; |
1631 xpt_done(ccb); | |
1632 break; 1633 } 1634 /* Check for command collision. */ 1635 if (siis_check_collision(dev, ccb)) { 1636 /* Freeze command. */ 1637 ch->frozen = ccb; 1638 /* We have only one frozen slot, so freeze simq also. */ 1639 xpt_freeze_simq(ch->sim, 1); 1640 return; 1641 } 1642 siis_begin_transaction(dev, ccb); | 1652 break; 1653 } 1654 /* Check for command collision. */ 1655 if (siis_check_collision(dev, ccb)) { 1656 /* Freeze command. */ 1657 ch->frozen = ccb; 1658 /* We have only one frozen slot, so freeze simq also. */ 1659 xpt_freeze_simq(ch->sim, 1); 1660 return; 1661 } 1662 siis_begin_transaction(dev, ccb); |
1643 break; | 1663 return; |
1644 case XPT_EN_LUN: /* Enable LUN as a target */ 1645 case XPT_TARGET_IO: /* Execute target I/O request */ 1646 case XPT_ACCEPT_TARGET_IO: /* Accept Host Target Mode CDB */ 1647 case XPT_CONT_TARGET_IO: /* Continue Host Target I/O Connection*/ 1648 case XPT_ABORT: /* Abort the specified CCB */ 1649 /* XXX Implement */ 1650 ccb->ccb_h.status = CAM_REQ_INVALID; | 1664 case XPT_EN_LUN: /* Enable LUN as a target */ 1665 case XPT_TARGET_IO: /* Execute target I/O request */ 1666 case XPT_ACCEPT_TARGET_IO: /* Accept Host Target Mode CDB */ 1667 case XPT_CONT_TARGET_IO: /* Continue Host Target I/O Connection*/ 1668 case XPT_ABORT: /* Abort the specified CCB */ 1669 /* XXX Implement */ 1670 ccb->ccb_h.status = CAM_REQ_INVALID; |
1651 xpt_done(ccb); | |
1652 break; 1653 case XPT_SET_TRAN_SETTINGS: 1654 { 1655 struct ccb_trans_settings *cts = &ccb->cts; 1656 struct siis_device *d; 1657 | 1671 break; 1672 case XPT_SET_TRAN_SETTINGS: 1673 { 1674 struct ccb_trans_settings *cts = &ccb->cts; 1675 struct siis_device *d; 1676 |
1677 if (siis_check_ids(dev, ccb)) 1678 return; |
|
1658 if (cts->type == CTS_TYPE_CURRENT_SETTINGS) 1659 d = &ch->curr[ccb->ccb_h.target_id]; 1660 else 1661 d = &ch->user[ccb->ccb_h.target_id]; 1662 if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION) 1663 d->revision = cts->xport_specific.sata.revision; 1664 if (cts->xport_specific.sata.valid & CTS_SATA_VALID_MODE) 1665 d->mode = cts->xport_specific.sata.mode; --- 6 unchanged lines hidden (view full) --- 1672 if (ch->pm_present) 1673 ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); 1674 else 1675 ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); 1676 } 1677 if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS) 1678 d->atapi = cts->xport_specific.sata.atapi; 1679 ccb->ccb_h.status = CAM_REQ_CMP; | 1679 if (cts->type == CTS_TYPE_CURRENT_SETTINGS) 1680 d = &ch->curr[ccb->ccb_h.target_id]; 1681 else 1682 d = &ch->user[ccb->ccb_h.target_id]; 1683 if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION) 1684 d->revision = cts->xport_specific.sata.revision; 1685 if (cts->xport_specific.sata.valid & CTS_SATA_VALID_MODE) 1686 d->mode = cts->xport_specific.sata.mode; --- 6 unchanged lines hidden (view full) --- 1693 if (ch->pm_present) 1694 ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); 1695 else 1696 ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); 1697 } 1698 if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS) 1699 d->atapi = cts->xport_specific.sata.atapi; 1700 ccb->ccb_h.status = CAM_REQ_CMP; |
1680 xpt_done(ccb); | |
1681 break; 1682 } 1683 case XPT_GET_TRAN_SETTINGS: 1684 /* Get default/user set transfer settings for the target */ 1685 { 1686 struct ccb_trans_settings *cts = &ccb->cts; 1687 struct siis_device *d; 1688 uint32_t status; 1689 | 1701 break; 1702 } 1703 case XPT_GET_TRAN_SETTINGS: 1704 /* Get default/user set transfer settings for the target */ 1705 { 1706 struct ccb_trans_settings *cts = &ccb->cts; 1707 struct siis_device *d; 1708 uint32_t status; 1709 |
1710 if (siis_check_ids(dev, ccb)) 1711 return; |
|
1690 if (cts->type == CTS_TYPE_CURRENT_SETTINGS) 1691 d = &ch->curr[ccb->ccb_h.target_id]; 1692 else 1693 d = &ch->user[ccb->ccb_h.target_id]; 1694 cts->protocol = PROTO_ATA; 1695 cts->protocol_version = PROTO_VERSION_UNSPECIFIED; 1696 cts->transport = XPORT_SATA; 1697 cts->transport_version = XPORT_VERSION_UNSPECIFIED; --- 19 unchanged lines hidden (view full) --- 1717 cts->xport_specific.sata.valid |= CTS_SATA_VALID_BYTECOUNT; 1718 cts->xport_specific.sata.pm_present = ch->pm_present; 1719 cts->xport_specific.sata.valid |= CTS_SATA_VALID_PM; 1720 cts->xport_specific.sata.tags = d->tags; 1721 cts->xport_specific.sata.valid |= CTS_SATA_VALID_TAGS; 1722 cts->xport_specific.sata.atapi = d->atapi; 1723 cts->xport_specific.sata.valid |= CTS_SATA_VALID_ATAPI; 1724 ccb->ccb_h.status = CAM_REQ_CMP; | 1712 if (cts->type == CTS_TYPE_CURRENT_SETTINGS) 1713 d = &ch->curr[ccb->ccb_h.target_id]; 1714 else 1715 d = &ch->user[ccb->ccb_h.target_id]; 1716 cts->protocol = PROTO_ATA; 1717 cts->protocol_version = PROTO_VERSION_UNSPECIFIED; 1718 cts->transport = XPORT_SATA; 1719 cts->transport_version = XPORT_VERSION_UNSPECIFIED; --- 19 unchanged lines hidden (view full) --- 1739 cts->xport_specific.sata.valid |= CTS_SATA_VALID_BYTECOUNT; 1740 cts->xport_specific.sata.pm_present = ch->pm_present; 1741 cts->xport_specific.sata.valid |= CTS_SATA_VALID_PM; 1742 cts->xport_specific.sata.tags = d->tags; 1743 cts->xport_specific.sata.valid |= CTS_SATA_VALID_TAGS; 1744 cts->xport_specific.sata.atapi = d->atapi; 1745 cts->xport_specific.sata.valid |= CTS_SATA_VALID_ATAPI; 1746 ccb->ccb_h.status = CAM_REQ_CMP; |
1725 xpt_done(ccb); | |
1726 break; 1727 } | 1747 break; 1748 } |
1728#if 0 1729 case XPT_CALC_GEOMETRY: 1730 { 1731 struct ccb_calc_geometry *ccg; 1732 uint32_t size_mb; 1733 uint32_t secs_per_cylinder; 1734 1735 ccg = &ccb->ccg; 1736 size_mb = ccg->volume_size 1737 / ((1024L * 1024L) / ccg->block_size); 1738 if (size_mb >= 1024 && (aha->extended_trans != 0)) { 1739 if (size_mb >= 2048) { 1740 ccg->heads = 255; 1741 ccg->secs_per_track = 63; 1742 } else { 1743 ccg->heads = 128; 1744 ccg->secs_per_track = 32; 1745 } 1746 } else { 1747 ccg->heads = 64; 1748 ccg->secs_per_track = 32; 1749 } 1750 secs_per_cylinder = ccg->heads * ccg->secs_per_track; 1751 ccg->cylinders = ccg->volume_size / secs_per_cylinder; 1752 ccb->ccb_h.status = CAM_REQ_CMP; 1753 xpt_done(ccb); 1754 break; 1755 } 1756#endif | |
1757 case XPT_RESET_BUS: /* Reset the specified SCSI bus */ 1758 case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */ 1759 siis_reset(dev); 1760 ccb->ccb_h.status = CAM_REQ_CMP; | 1749 case XPT_RESET_BUS: /* Reset the specified SCSI bus */ 1750 case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */ 1751 siis_reset(dev); 1752 ccb->ccb_h.status = CAM_REQ_CMP; |
1761 xpt_done(ccb); | |
1762 break; 1763 case XPT_TERM_IO: /* Terminate the I/O process */ 1764 /* XXX Implement */ 1765 ccb->ccb_h.status = CAM_REQ_INVALID; | 1753 break; 1754 case XPT_TERM_IO: /* Terminate the I/O process */ 1755 /* XXX Implement */ 1756 ccb->ccb_h.status = CAM_REQ_INVALID; |
1766 xpt_done(ccb); | |
1767 break; 1768 case XPT_PATH_INQ: /* Path routing inquiry */ 1769 { 1770 struct ccb_pathinq *cpi = &ccb->cpi; 1771 1772 cpi->version_num = 1; /* XXX??? */ 1773 cpi->hba_inquiry = PI_SDTR_ABLE | PI_TAG_ABLE; 1774 cpi->hba_inquiry |= PI_SATAPM; --- 10 unchanged lines hidden (view full) --- 1785 strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); 1786 cpi->unit_number = cam_sim_unit(sim); 1787 cpi->transport = XPORT_SATA; 1788 cpi->transport_version = XPORT_VERSION_UNSPECIFIED; 1789 cpi->protocol = PROTO_ATA; 1790 cpi->protocol_version = PROTO_VERSION_UNSPECIFIED; 1791 cpi->ccb_h.status = CAM_REQ_CMP; 1792 cpi->maxio = MAXPHYS; | 1757 break; 1758 case XPT_PATH_INQ: /* Path routing inquiry */ 1759 { 1760 struct ccb_pathinq *cpi = &ccb->cpi; 1761 1762 cpi->version_num = 1; /* XXX??? */ 1763 cpi->hba_inquiry = PI_SDTR_ABLE | PI_TAG_ABLE; 1764 cpi->hba_inquiry |= PI_SATAPM; --- 10 unchanged lines hidden (view full) --- 1775 strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); 1776 cpi->unit_number = cam_sim_unit(sim); 1777 cpi->transport = XPORT_SATA; 1778 cpi->transport_version = XPORT_VERSION_UNSPECIFIED; 1779 cpi->protocol = PROTO_ATA; 1780 cpi->protocol_version = PROTO_VERSION_UNSPECIFIED; 1781 cpi->ccb_h.status = CAM_REQ_CMP; 1782 cpi->maxio = MAXPHYS; |
1793 xpt_done(ccb); | |
1794 break; 1795 } 1796 default: 1797 ccb->ccb_h.status = CAM_REQ_INVALID; | 1783 break; 1784 } 1785 default: 1786 ccb->ccb_h.status = CAM_REQ_INVALID; |
1798 xpt_done(ccb); | |
1799 break; 1800 } | 1787 break; 1788 } |
1789 xpt_done(ccb); |
|
1801} 1802 1803static void 1804siispoll(struct cam_sim *sim) 1805{ 1806 struct siis_channel *ch = (struct siis_channel *)cam_sim_softc(sim); 1807 1808 siis_ch_intr(ch->dev); 1809} | 1790} 1791 1792static void 1793siispoll(struct cam_sim *sim) 1794{ 1795 struct siis_channel *ch = (struct siis_channel *)cam_sim_softc(sim); 1796 1797 siis_ch_intr(ch->dev); 1798} |