pcount; 1692 1693 if (rio_mport_read_config_32(mport, destid, hopcount, 1694 RIO_PEF_CAR, &rval)) 1695 return -EIO; 1696 1697 if (rval & RIO_PEF_SWITCH) { 1698 rio_mport_read_config_32(mport, destid, hopcount, 1699 RIO_SWP_INFO_CAR, &swpinfo); 1700 size += struct_size(rswitch, nextdev, RIO_GET_TOTAL_PORTS(swpinfo)); 1701 } 1702 1703 rdev = kzalloc(size, GFP_KERNEL); 1704 if (rdev == NULL) 1705 return -ENOMEM; 1706 1707 if (mport->net == NULL) { 1708 struct rio_net *net; 1709 1710 net = rio_alloc_net(mport); 1711 if (!net) { 1712 err = -ENOMEM; 1713 rmcd_debug(RDEV, "failed to allocate net object"); 1714 goto cleanup; 1715 } 1716 1717 net->id = mport->id; 1718 net->hport = mport; 1719 dev_set_name(&net->dev, "rnet_%d", net->id); 1720 net->dev.parent = &mport->dev; 1721 net->dev.release = rio_release_net; 1722 err = rio_add_net(net); 1723 if (err) { 1724 rmcd_debug(RDEV, "failed to register net, err=%d", err); 1725 put_device(&net->dev); 1726 mport->net = NULL; 1727 goto cleanup; 1728 } 1729 } 1730 1731 rdev->net = mport->net; 1732 rdev->pef = rval; 1733 rdev->swpinfo = swpinfo; 1734 rio_mport_read_config_32(mport, destid, hopcount, 1735 RIO_DEV_ID_CAR, &rval); 1736 rdev->did = rval >> 16; 1737 rdev->vid = rval & 0xffff; 1738 rio_mport_read_config_32(mport, destid, hopcount, RIO_DEV_INFO_CAR, 1739 &rdev->device_rev); 1740 rio_mport_read_config_32(mport, destid, hopcount, RIO_ASM_ID_CAR, 1741 &rval); 1742 rdev->asm_did = rval >> 16; 1743 rdev->asm_vid = rval & 0xffff; 1744 rio_mport_read_config_32(mport, destid, hopcount, RIO_ASM_INFO_CAR, 1745 &rval); 1746 rdev->asm_rev = rval >> 16; 1747 1748 if (rdev->pef & RIO_PEF_EXT_FEATURES) { 1749 rdev->efptr = rval & 0xffff; 1750 rdev->phys_efptr = rio_mport_get_physefb(mport, 0, destid, 1751 hopcount, &rdev->phys_rmap); 1752 1753 rdev->em_efptr = rio_mport_get_feature(mport, 0, destid, 1754 hopcount, RIO_EFB_ERR_MGMNT); 1755 } 1756 1757 rio_mport_read_config_32(mport, destid, hopcount, RIO_SRC_OPS_CAR, 1758 &rdev->src_ops); 1759 rio_mport_read_config_32(mport, destid, hopcount, RIO_DST_OPS_CAR, 1760 &rdev->dst_ops); 1761 1762 rdev->comp_tag = dev_info.comptag; 1763 rdev->destid = destid; 1764 /* hopcount is stored as specified by a caller, regardles of EP or SW */ 1765 rdev->hopcount = hopcount; 1766 1767 if (rdev->pef & RIO_PEF_SWITCH) { 1768 rswitch = rdev->rswitch; 1769 rswitch->route_table = NULL; 1770 } 1771 1772 if (strlen(dev_info.name)) 1773 dev_set_name(&rdev->dev, "%s", dev_info.name); 1774 else if (rdev->pef & RIO_PEF_SWITCH) 1775 dev_set_name(&rdev->dev, "%02x:s:%04x", mport->id, 1776 rdev->comp_tag & RIO_CTAG_UDEVID); 1777 else 1778 dev_set_name(&rdev->dev, "%02x:e:%04x", mport->id, 1779 rdev->comp_tag & RIO_CTAG_UDEVID); 1780 1781 INIT_LIST_HEAD(&rdev->net_list); 1782 rdev->dev.parent = &mport->net->dev; 1783 rio_attach_device(rdev); 1784 rdev->dev.release = rio_release_dev; 1785 1786 if (rdev->dst_ops & RIO_DST_OPS_DOORBELL) 1787 rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE], 1788 0, 0xffff); 1789 err = rio_add_device(rdev); 1790 if (err) { 1791 put_device(&rdev->dev); 1793 return err; 1794 } 1795 1796 rio_dev_get(rdev); 1797 1798 return 0; 1799 cleanup: 1800 kfree(rdev); 1801 return err; 1802 } 1803 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki[PATCH] rapidio: fix a resource leak when rio_add_device() failskernel test robot undefinedHaoxiang Li , mporter@kernel.crashing.org, alex.bou9@gmail.com, akpm@linux-foundation.org, dan.carpenter@linaro.org, linux@treblig.org undefined undefined undefined undefined undefined undefined undefined undefined undefined