@@ -1680,6 +1680,262 @@ static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct
16801680 KUNIT_EXPECT_EQ (test , ret , - EMSGSIZE );
16811681}
16821682
1683+ static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal (struct kunit * test )
1684+ {
1685+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1686+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1687+ int ret ;
1688+ struct cros_ec_command msg ;
1689+
1690+ memset (& msg , 0 , sizeof (msg ));
1691+
1692+ ec_dev -> proto_version = 3 ;
1693+ ec_dev -> cmd_xfer = cros_kunit_ec_cmd_xfer_mock ;
1694+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1695+
1696+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1697+ KUNIT_EXPECT_EQ (test , ret , 0 );
1698+
1699+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_cmd_xfer_mock_called , 0 );
1700+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_pkt_xfer_mock_called , 1 );
1701+ }
1702+
1703+ static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op (struct kunit * test )
1704+ {
1705+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1706+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1707+ int ret ;
1708+ struct cros_ec_command msg ;
1709+
1710+ memset (& msg , 0 , sizeof (msg ));
1711+
1712+ ec_dev -> proto_version = 3 ;
1713+ ec_dev -> cmd_xfer = cros_kunit_ec_cmd_xfer_mock ;
1714+ ec_dev -> pkt_xfer = NULL ;
1715+
1716+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1717+ KUNIT_EXPECT_EQ (test , ret , - EIO );
1718+ }
1719+
1720+ static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal (struct kunit * test )
1721+ {
1722+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1723+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1724+ int ret ;
1725+ struct cros_ec_command msg ;
1726+
1727+ memset (& msg , 0 , sizeof (msg ));
1728+
1729+ ec_dev -> proto_version = 2 ;
1730+ ec_dev -> cmd_xfer = cros_kunit_ec_cmd_xfer_mock ;
1731+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1732+
1733+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1734+ KUNIT_EXPECT_EQ (test , ret , 0 );
1735+
1736+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_cmd_xfer_mock_called , 1 );
1737+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_pkt_xfer_mock_called , 0 );
1738+ }
1739+
1740+ static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op (struct kunit * test )
1741+ {
1742+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1743+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1744+ int ret ;
1745+ struct cros_ec_command msg ;
1746+
1747+ memset (& msg , 0 , sizeof (msg ));
1748+
1749+ ec_dev -> proto_version = 2 ;
1750+ ec_dev -> cmd_xfer = NULL ;
1751+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1752+
1753+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1754+ KUNIT_EXPECT_EQ (test , ret , - EIO );
1755+ }
1756+
1757+ static void cros_ec_proto_test_cmd_xfer_in_progress_normal (struct kunit * test )
1758+ {
1759+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1760+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1761+ struct ec_xfer_mock * mock ;
1762+ int ret ;
1763+ struct cros_ec_command msg ;
1764+
1765+ memset (& msg , 0 , sizeof (msg ));
1766+
1767+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1768+
1769+ /* For the first host command to return EC_RES_IN_PROGRESS. */
1770+ {
1771+ mock = cros_kunit_ec_xfer_mock_addx (test , 0 , EC_RES_IN_PROGRESS , 0 );
1772+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1773+ }
1774+
1775+ /* For EC_CMD_GET_COMMS_STATUS. */
1776+ {
1777+ struct ec_response_get_comms_status * data ;
1778+
1779+ mock = cros_kunit_ec_xfer_mock_add (test , sizeof (* data ));
1780+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1781+
1782+ data = (struct ec_response_get_comms_status * )mock -> o_data ;
1783+ data -> flags = 0 ;
1784+ }
1785+
1786+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1787+ KUNIT_EXPECT_EQ (test , ret , sizeof (struct ec_response_get_comms_status ));
1788+
1789+ KUNIT_EXPECT_EQ (test , msg .result , EC_RES_SUCCESS );
1790+
1791+ /* For the first host command to return EC_RES_IN_PROGRESS. */
1792+ {
1793+ mock = cros_kunit_ec_xfer_mock_next ();
1794+ KUNIT_EXPECT_PTR_NE (test , mock , NULL );
1795+ }
1796+
1797+ /* For EC_CMD_GET_COMMS_STATUS. */
1798+ {
1799+ mock = cros_kunit_ec_xfer_mock_next ();
1800+ KUNIT_EXPECT_PTR_NE (test , mock , NULL );
1801+
1802+ KUNIT_EXPECT_EQ (test , mock -> msg .version , 0 );
1803+ KUNIT_EXPECT_EQ (test , mock -> msg .command , EC_CMD_GET_COMMS_STATUS );
1804+ KUNIT_EXPECT_EQ (test , mock -> msg .insize ,
1805+ sizeof (struct ec_response_get_comms_status ));
1806+ KUNIT_EXPECT_EQ (test , mock -> msg .outsize , 0 );
1807+ }
1808+
1809+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_pkt_xfer_mock_called , 2 );
1810+ }
1811+
1812+ static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain (struct kunit * test )
1813+ {
1814+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1815+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1816+ struct ec_xfer_mock * mock ;
1817+ int ret ;
1818+ struct cros_ec_command msg ;
1819+
1820+ memset (& msg , 0 , sizeof (msg ));
1821+
1822+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1823+
1824+ /* For the first host command to return EC_RES_IN_PROGRESS. */
1825+ {
1826+ mock = cros_kunit_ec_xfer_mock_addx (test , 0 , EC_RES_IN_PROGRESS , 0 );
1827+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1828+ }
1829+
1830+ /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1831+ cros_kunit_ec_xfer_mock_default_ret = - EAGAIN ;
1832+
1833+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1834+ KUNIT_EXPECT_EQ (test , ret , - EAGAIN );
1835+
1836+ /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1837+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_pkt_xfer_mock_called , 51 );
1838+ }
1839+
1840+ static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing (struct kunit * test )
1841+ {
1842+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1843+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1844+ struct ec_xfer_mock * mock ;
1845+ int ret ;
1846+ struct cros_ec_command msg ;
1847+
1848+ memset (& msg , 0 , sizeof (msg ));
1849+
1850+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1851+
1852+ /* For the first host command to return EC_RES_IN_PROGRESS. */
1853+ {
1854+ mock = cros_kunit_ec_xfer_mock_addx (test , 0 , EC_RES_IN_PROGRESS , 0 );
1855+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1856+ }
1857+
1858+ /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1859+ {
1860+ struct ec_response_get_comms_status * data ;
1861+ int i ;
1862+
1863+ for (i = 0 ; i < 50 ; ++ i ) {
1864+ mock = cros_kunit_ec_xfer_mock_add (test , sizeof (* data ));
1865+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1866+
1867+ data = (struct ec_response_get_comms_status * )mock -> o_data ;
1868+ data -> flags |= EC_COMMS_STATUS_PROCESSING ;
1869+ }
1870+ }
1871+
1872+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1873+ KUNIT_EXPECT_EQ (test , ret , sizeof (struct ec_response_get_comms_status ));
1874+
1875+ KUNIT_EXPECT_EQ (test , msg .result , EC_RES_SUCCESS );
1876+
1877+ /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1878+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_pkt_xfer_mock_called , 51 );
1879+ }
1880+
1881+ static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error (struct kunit * test )
1882+ {
1883+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1884+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1885+ struct ec_xfer_mock * mock ;
1886+ int ret ;
1887+ struct cros_ec_command msg ;
1888+
1889+ memset (& msg , 0 , sizeof (msg ));
1890+
1891+ /* For the first host command to return EC_RES_IN_PROGRESS. */
1892+ {
1893+ mock = cros_kunit_ec_xfer_mock_addx (test , 0 , EC_RES_IN_PROGRESS , 0 );
1894+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1895+ }
1896+
1897+ /* For EC_CMD_GET_COMMS_STATUS. */
1898+ {
1899+ mock = cros_kunit_ec_xfer_mock_addx (test , - EIO , EC_RES_SUCCESS , 0 );
1900+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1901+ }
1902+
1903+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1904+ KUNIT_EXPECT_EQ (test , ret , - EIO );
1905+ }
1906+
1907+ static void cros_ec_proto_test_cmd_xfer_in_progress_return_error (struct kunit * test )
1908+ {
1909+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1910+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1911+ struct ec_xfer_mock * mock ;
1912+ int ret ;
1913+ struct cros_ec_command msg ;
1914+
1915+ memset (& msg , 0 , sizeof (msg ));
1916+
1917+ ec_dev -> pkt_xfer = cros_kunit_ec_pkt_xfer_mock ;
1918+
1919+ /* For the first host command to return EC_RES_IN_PROGRESS. */
1920+ {
1921+ mock = cros_kunit_ec_xfer_mock_addx (test , 0 , EC_RES_IN_PROGRESS , 0 );
1922+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1923+ }
1924+
1925+ /* For EC_CMD_GET_COMMS_STATUS. */
1926+ {
1927+ mock = cros_kunit_ec_xfer_mock_addx (test , 0 , EC_RES_INVALID_COMMAND , 0 );
1928+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1929+ }
1930+
1931+ ret = cros_ec_cmd_xfer (ec_dev , & msg );
1932+ KUNIT_EXPECT_EQ (test , ret , 0 );
1933+
1934+ KUNIT_EXPECT_EQ (test , msg .result , EC_RES_INVALID_COMMAND );
1935+
1936+ KUNIT_EXPECT_EQ (test , cros_kunit_ec_pkt_xfer_mock_called , 2 );
1937+ }
1938+
16831939static void cros_ec_proto_test_release (struct device * dev )
16841940{
16851941}
@@ -1750,6 +2006,15 @@ static struct kunit_case cros_ec_proto_test_cases[] = {
17502006 KUNIT_CASE (cros_ec_proto_test_cmd_xfer_excess_msg_insize ),
17512007 KUNIT_CASE (cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru ),
17522008 KUNIT_CASE (cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru ),
2009+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_protocol_v3_normal ),
2010+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_protocol_v3_no_op ),
2011+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_protocol_v2_normal ),
2012+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_protocol_v2_no_op ),
2013+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_in_progress_normal ),
2014+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain ),
2015+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing ),
2016+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_in_progress_xfer_error ),
2017+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_in_progress_return_error ),
17532018 {}
17542019};
17552020
0 commit comments