Deleted Added
full compact
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}