[bug report] usb: typec: tcpm: add discover identity support for SOP'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello RD Babiera,

The patch fb7ff25ae433: "usb: typec: tcpm: add discover identity
support for SOP'" from Jan 8, 2024 (linux-next), leads to the
following Smatch static checker warning:

	drivers/usb/typec/tcpm/tcpm.c:1931 tcpm_pd_svdm()
	error: uninitialized symbol 'svdm_version'.

drivers/usb/typec/tcpm/tcpm.c
    1859 static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
    1860                         const u32 *p, int cnt, u32 *response,
    1861                         enum adev_actions *adev_action,
    1862                         enum tcpm_transmit_type rx_sop_type,
    1863                         enum tcpm_transmit_type *response_tx_sop_type)
    1864 {
    1865         struct typec_port *typec = port->typec_port;
    1866         struct typec_altmode *pdev, *pdev_prime;
    1867         struct pd_mode_data *modep, *modep_prime;
    1868         int svdm_version;
    1869         int rlen = 0;
    1870         int cmd_type;
    1871         int cmd;
    1872         int i;
    1873         int ret;
    1874 
    1875         cmd_type = PD_VDO_CMDT(p[0]);
    1876         cmd = PD_VDO_CMD(p[0]);
    1877 
    1878         tcpm_log(port, "Rx VDM cmd 0x%x type %d cmd %d len %d",
    1879                  p[0], cmd_type, cmd, cnt);
    1880 
    1881         modep = &port->mode_data;
    1882 
    1883         pdev = typec_match_altmode(port->partner_altmode, ALTMODE_DISCOVERY_MAX,
    1884                                    PD_VDO_VID(p[0]), PD_VDO_OPOS(p[0]));
    1885 
    1886         switch (rx_sop_type) {
    1887         case TCPC_TX_SOP_PRIME:
    1888                 modep_prime = &port->mode_data_prime;
    1889                 pdev_prime = typec_match_altmode(port->plug_prime_altmode,
    1890                                                  ALTMODE_DISCOVERY_MAX,
    1891                                                  PD_VDO_VID(p[0]),
    1892                                                  PD_VDO_OPOS(p[0]));
    1893                 if (!IS_ERR_OR_NULL(port->cable)) {
    1894                         svdm_version = typec_get_cable_svdm_version(typec);
    1895                         if (PD_VDO_SVDM_VER(p[0]) < svdm_version)
    1896                                 typec_cable_set_svdm_version(port->cable, svdm_version);
    1897                 }

svdm_version is uninitialized if port->cable isn't a valid pointer.

    1898                 break;
    1899         case TCPC_TX_SOP:
    1900                 modep = &port->mode_data;
    1901                 pdev = typec_match_altmode(port->partner_altmode,
    1902                                            ALTMODE_DISCOVERY_MAX,
    1903                                            PD_VDO_VID(p[0]),
    1904                                            PD_VDO_OPOS(p[0]));
    1905                 svdm_version = typec_get_negotiated_svdm_version(typec);
    1906                 if (svdm_version < 0)
    1907                         return 0;
    1908                 break;
    1909         default:
    1910                 modep = &port->mode_data;
    1911                 pdev = typec_match_altmode(port->partner_altmode,
    1912                                            ALTMODE_DISCOVERY_MAX,
    1913                                            PD_VDO_VID(p[0]),
    1914                                            PD_VDO_OPOS(p[0]));
    1915                 svdm_version = typec_get_negotiated_svdm_version(typec);
    1916                 if (svdm_version < 0)
    1917                         return 0;
    1918                 break;
    1919         }
    1920 
    1921         switch (cmd_type) {
    1922         case CMDT_INIT:
    1923                 switch (cmd) {
    1924                 case CMD_DISCOVER_IDENT:
    1925                         if (PD_VDO_VID(p[0]) != USB_SID_PD)
    1926                                 break;
    1927 
    1928                         if (IS_ERR_OR_NULL(port->partner))
    1929                                 break;
    1930 
--> 1931                         if (PD_VDO_SVDM_VER(p[0]) < svdm_version) {
                                                             ^^^^^^^^^^^^

    1932                                 typec_partner_set_svdm_version(port->partner,
    1933                                                                PD_VDO_SVDM_VER(p[0]));
    1934                                 svdm_version = PD_VDO_SVDM_VER(p[0]);
    1935                         }

regards,
dan carpenter




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux