* drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w]
@ 2023-12-12 18:43 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2023-12-12 18:43 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Arnd Bergmann <arnd@arndb.de>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 26aff849438cebcd05f1a647390c4aa700d5c0f1
commit: 25ec92fbdd23a0a2bfd2bdf489e60ea4f0ae46d1 hamradio: use ndo_siocdevprivate
date: 2 years, 5 months ago
:::::: branch date: 18 hours ago
:::::: commit date: 2 years, 5 months ago
config: i386-randconfig-141-20231111 (https://download.01.org/0day-ci/archive/20231213/202312130248.uy0tleLI-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20231213/202312130248.uy0tleLI-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202312130248.uy0tleLI-lkp@intel.com/
New smatch warnings:
drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w]
drivers/net/hamradio/scc.c:1783 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1946 scc_net_siocdevprivate() warn: 'hwcfg.vector_latch' from __request_region() not released on lines: 1827.
Old smatch warnings:
drivers/net/hamradio/scc.c:1784 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1785 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1786 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1787 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1788 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1800 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1801 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1802 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1803 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1804 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1822 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1823 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1826 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
vim +/Ivec +1748 drivers/net/hamradio/scc.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 1695
^1da177e4c3f41 Linus Torvalds 2005-04-16 1696 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1697 * SIOCSCCCFG - configure driver arg: (struct scc_hw_config *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1698 * SIOCSCCINI - initialize driver arg: ---
^1da177e4c3f41 Linus Torvalds 2005-04-16 1699 * SIOCSCCCHANINI - initialize channel arg: (struct scc_modem *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1700 * SIOCSCCSMEM - set memory arg: (struct scc_mem_config *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1701 * SIOCSCCGKISS - get level 1 parameter arg: (struct scc_kiss_cmd *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1702 * SIOCSCCSKISS - set level 1 parameter arg: (struct scc_kiss_cmd *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1703 * SIOCSCCGSTAT - get driver status arg: (struct scc_stat *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1704 * SIOCSCCCAL - send calib. pattern arg: (struct scc_calibrate *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1705 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1706
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1707 static int scc_net_siocdevprivate(struct net_device *dev,
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1708 struct ifreq *ifr, void __user *arg, int cmd)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1709 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1710 struct scc_kiss_cmd kiss_cmd;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1711 struct scc_mem_config memcfg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1712 struct scc_hw_config hwcfg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1713 struct scc_calibrate cal;
f4bdd264b43cc6 Wang Chen 2008-11-20 1714 struct scc_channel *scc = (struct scc_channel *) dev->ml_priv;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1715 int chan;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1716 unsigned char device_name[IFNAMSIZ];
^1da177e4c3f41 Linus Torvalds 2005-04-16 1717
^1da177e4c3f41 Linus Torvalds 2005-04-16 1718 if (!Driver_Initialized)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1719 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1720 if (cmd == SIOCSCCCFG)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1721 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1722 int found = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1723
^1da177e4c3f41 Linus Torvalds 2005-04-16 1724 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1725 if (in_compat_syscall())
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1726 return -EOPNOTSUPP;
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1727
^1da177e4c3f41 Linus Torvalds 2005-04-16 1728 if (!arg) return -EFAULT;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1729
^1da177e4c3f41 Linus Torvalds 2005-04-16 1730 if (Nchips >= SCC_MAXCHIPS)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1731 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1732
^1da177e4c3f41 Linus Torvalds 2005-04-16 1733 if (copy_from_user(&hwcfg, arg, sizeof(hwcfg)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1734 return -EFAULT;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1735
^1da177e4c3f41 Linus Torvalds 2005-04-16 1736 if (hwcfg.irq == 2) hwcfg.irq = 9;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1737
60e4ad7a72fd7c Yinghai Lu 2008-08-19 1738 if (hwcfg.irq < 0 || hwcfg.irq >= nr_irqs)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1739 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1740
^1da177e4c3f41 Linus Torvalds 2005-04-16 1741 if (!Ivec[hwcfg.irq].used && hwcfg.irq)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1742 {
1b36efe07f83ec Jeff Garzik 2007-10-29 1743 if (request_irq(hwcfg.irq, scc_isr,
9714481e677562 Michael Opdenacker 2013-10-05 1744 0, "AX.25 SCC",
1b36efe07f83ec Jeff Garzik 2007-10-29 1745 (void *)(long) hwcfg.irq))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1746 printk(KERN_WARNING "z8530drv: warning, cannot get IRQ %d\n", hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1747 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1748 Ivec[hwcfg.irq].used = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1749 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1750
^1da177e4c3f41 Linus Torvalds 2005-04-16 1751 if (hwcfg.vector_latch && !Vector_Latch) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1752 if (!request_region(hwcfg.vector_latch, 1, "scc vector latch"))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1753 printk(KERN_WARNING "z8530drv: warning, cannot reserve vector latch port 0x%lx\n, disabled.", hwcfg.vector_latch);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1754 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1755 Vector_Latch = hwcfg.vector_latch;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1756 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1757
^1da177e4c3f41 Linus Torvalds 2005-04-16 1758 if (hwcfg.clock == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1759 hwcfg.clock = SCC_DEFAULT_CLOCK;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1760
^1da177e4c3f41 Linus Torvalds 2005-04-16 1761 #ifndef SCC_DONT_CHECK
^1da177e4c3f41 Linus Torvalds 2005-04-16 1762
^1da177e4c3f41 Linus Torvalds 2005-04-16 1763 if(request_region(hwcfg.ctrl_a, 1, "scc-probe"))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1764 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1765 disable_irq(hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1766 Outb(hwcfg.ctrl_a, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1767 OutReg(hwcfg.ctrl_a, R9, FHWRES);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1768 udelay(100);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1769 OutReg(hwcfg.ctrl_a,R13,0x55); /* is this chip really there? */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1770 udelay(5);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1771
^1da177e4c3f41 Linus Torvalds 2005-04-16 1772 if (InReg(hwcfg.ctrl_a,R13) != 0x55)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1773 found = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1774 enable_irq(hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1775 release_region(hwcfg.ctrl_a, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1776 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1777 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1778 found = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1779 #endif
^1da177e4c3f41 Linus Torvalds 2005-04-16 1780
^1da177e4c3f41 Linus Torvalds 2005-04-16 1781 if (found)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1782 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1783 SCC_Info[2*Nchips ].ctrl = hwcfg.ctrl_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1784 SCC_Info[2*Nchips ].data = hwcfg.data_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1785 SCC_Info[2*Nchips ].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1786 SCC_Info[2*Nchips+1].ctrl = hwcfg.ctrl_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1787 SCC_Info[2*Nchips+1].data = hwcfg.data_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1788 SCC_Info[2*Nchips+1].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1789
^1da177e4c3f41 Linus Torvalds 2005-04-16 1790 SCC_ctrl[Nchips].chan_A = hwcfg.ctrl_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1791 SCC_ctrl[Nchips].chan_B = hwcfg.ctrl_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1792 SCC_ctrl[Nchips].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1793 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1794
^1da177e4c3f41 Linus Torvalds 2005-04-16 1795
^1da177e4c3f41 Linus Torvalds 2005-04-16 1796 for (chan = 0; chan < 2; chan++)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1797 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1798 sprintf(device_name, "%s%i", SCC_DriverName, 2*Nchips+chan);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1799
^1da177e4c3f41 Linus Torvalds 2005-04-16 1800 SCC_Info[2*Nchips+chan].special = hwcfg.special;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1801 SCC_Info[2*Nchips+chan].clock = hwcfg.clock;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1802 SCC_Info[2*Nchips+chan].brand = hwcfg.brand;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1803 SCC_Info[2*Nchips+chan].option = hwcfg.option;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1804 SCC_Info[2*Nchips+chan].enhanced = hwcfg.escc;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1805
^1da177e4c3f41 Linus Torvalds 2005-04-16 1806 #ifdef SCC_DONT_CHECK
^1da177e4c3f41 Linus Torvalds 2005-04-16 1807 printk(KERN_INFO "%s: data port = 0x%3.3x control port = 0x%3.3x\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 1808 device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1809 SCC_Info[2*Nchips+chan].data,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1810 SCC_Info[2*Nchips+chan].ctrl);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1811
^1da177e4c3f41 Linus Torvalds 2005-04-16 1812 #else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1813 printk(KERN_INFO "%s: data port = 0x%3.3lx control port = 0x%3.3lx -- %s\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 1814 device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1815 chan? hwcfg.data_b : hwcfg.data_a,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1816 chan? hwcfg.ctrl_b : hwcfg.ctrl_a,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1817 found? "found" : "missing");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1818 #endif
^1da177e4c3f41 Linus Torvalds 2005-04-16 1819
^1da177e4c3f41 Linus Torvalds 2005-04-16 1820 if (found)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1821 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1822 request_region(SCC_Info[2*Nchips+chan].ctrl, 1, "scc ctrl");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1823 request_region(SCC_Info[2*Nchips+chan].data, 1, "scc data");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1824 if (Nchips+chan != 0 &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 1825 scc_net_alloc(device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1826 &SCC_Info[2*Nchips+chan]))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1827 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1828 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1829 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1830
^1da177e4c3f41 Linus Torvalds 2005-04-16 1831 if (found) Nchips++;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1832
^1da177e4c3f41 Linus Torvalds 2005-04-16 1833 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1834 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1835
^1da177e4c3f41 Linus Torvalds 2005-04-16 1836 if (cmd == SIOCSCCINI)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1837 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1838 if (!capable(CAP_SYS_RAWIO))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1839 return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1840
^1da177e4c3f41 Linus Torvalds 2005-04-16 1841 if (Nchips == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1842 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1843
^1da177e4c3f41 Linus Torvalds 2005-04-16 1844 z8530_init();
^1da177e4c3f41 Linus Torvalds 2005-04-16 1845 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1846 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1847
^1da177e4c3f41 Linus Torvalds 2005-04-16 1848 return -EINVAL; /* confuse the user */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1849 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1850
^1da177e4c3f41 Linus Torvalds 2005-04-16 1851 if (!scc->init)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1852 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1853 if (cmd == SIOCSCCCHANINI)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1854 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1855 if (!capable(CAP_NET_ADMIN)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1856 if (!arg) return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1857
^1da177e4c3f41 Linus Torvalds 2005-04-16 1858 scc->stat.bufsize = SCC_BUFSIZE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1859
^1da177e4c3f41 Linus Torvalds 2005-04-16 1860 if (copy_from_user(&scc->modem, arg, sizeof(struct scc_modem)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1861 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1862
^1da177e4c3f41 Linus Torvalds 2005-04-16 1863 /* default KISS Params */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1864
^1da177e4c3f41 Linus Torvalds 2005-04-16 1865 if (scc->modem.speed < 4800)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1866 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1867 scc->kiss.txdelay = 36; /* 360 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1868 scc->kiss.persist = 42; /* 25% persistence */ /* was 25 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1869 scc->kiss.slottime = 16; /* 160 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1870 scc->kiss.tailtime = 4; /* minimal reasonable value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1871 scc->kiss.fulldup = 0; /* CSMA */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1872 scc->kiss.waittime = 50; /* 500 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1873 scc->kiss.maxkeyup = 10; /* 10 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1874 scc->kiss.mintime = 3; /* 3 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1875 scc->kiss.idletime = 30; /* 30 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1876 scc->kiss.maxdefer = 120; /* 2 min */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1877 scc->kiss.softdcd = 0; /* hardware dcd */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1878 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1879 scc->kiss.txdelay = 10; /* 100 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1880 scc->kiss.persist = 64; /* 25% persistence */ /* was 25 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1881 scc->kiss.slottime = 8; /* 160 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1882 scc->kiss.tailtime = 1; /* minimal reasonable value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1883 scc->kiss.fulldup = 0; /* CSMA */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1884 scc->kiss.waittime = 50; /* 500 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1885 scc->kiss.maxkeyup = 7; /* 7 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1886 scc->kiss.mintime = 3; /* 3 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1887 scc->kiss.idletime = 30; /* 30 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1888 scc->kiss.maxdefer = 120; /* 2 min */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1889 scc->kiss.softdcd = 0; /* hardware dcd */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1890 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1891
^1da177e4c3f41 Linus Torvalds 2005-04-16 1892 scc->tx_buff = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1893 skb_queue_head_init(&scc->tx_queue);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1894 scc->init = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1895
^1da177e4c3f41 Linus Torvalds 2005-04-16 1896 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1897 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1898
^1da177e4c3f41 Linus Torvalds 2005-04-16 1899 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1900 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1901
^1da177e4c3f41 Linus Torvalds 2005-04-16 1902 switch(cmd)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1903 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1904 case SIOCSCCRESERVED:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1905 return -ENOIOCTLCMD;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1906
^1da177e4c3f41 Linus Torvalds 2005-04-16 1907 case SIOCSCCSMEM:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1908 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1909 if (!arg || copy_from_user(&memcfg, arg, sizeof(memcfg)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1910 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1911 scc->stat.bufsize = memcfg.bufsize;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1912 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1913
^1da177e4c3f41 Linus Torvalds 2005-04-16 1914 case SIOCSCCGSTAT:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1915 if (!arg || copy_to_user(arg, &scc->stat, sizeof(scc->stat)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1916 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1917 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1918
^1da177e4c3f41 Linus Torvalds 2005-04-16 1919 case SIOCSCCGKISS:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1920 if (!arg || copy_from_user(&kiss_cmd, arg, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1921 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1922 kiss_cmd.param = scc_get_param(scc, kiss_cmd.command);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1923 if (copy_to_user(arg, &kiss_cmd, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1924 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1925 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1926
^1da177e4c3f41 Linus Torvalds 2005-04-16 1927 case SIOCSCCSKISS:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1928 if (!capable(CAP_NET_ADMIN)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1929 if (!arg || copy_from_user(&kiss_cmd, arg, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1930 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1931 return scc_set_param(scc, kiss_cmd.command, kiss_cmd.param);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1932
^1da177e4c3f41 Linus Torvalds 2005-04-16 1933 case SIOCSCCCAL:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1934 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1935 if (!arg || copy_from_user(&cal, arg, sizeof(cal)) || cal.time == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1936 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1937
^1da177e4c3f41 Linus Torvalds 2005-04-16 1938 scc_start_calibrate(scc, cal.time, cal.pattern);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1939 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1940
^1da177e4c3f41 Linus Torvalds 2005-04-16 1941 default:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1942 return -ENOIOCTLCMD;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1943
^1da177e4c3f41 Linus Torvalds 2005-04-16 1944 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1945
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1946 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1947 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1948
:::::: The code at line 1748 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread* drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w]
@ 2023-12-13 15:16 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2023-12-13 15:16 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Arnd Bergmann <arnd@arndb.de>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 88035e5694a86a7167d490bb95e9df97a9bb162b
commit: 25ec92fbdd23a0a2bfd2bdf489e60ea4f0ae46d1 hamradio: use ndo_siocdevprivate
date: 2 years, 5 months ago
:::::: branch date: 14 hours ago
:::::: commit date: 2 years, 5 months ago
config: i386-randconfig-141-20231111 (https://download.01.org/0day-ci/archive/20231213/202312132304.F7hG3JIH-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20231213/202312132304.F7hG3JIH-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202312132304.F7hG3JIH-lkp@intel.com/
New smatch warnings:
drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w]
drivers/net/hamradio/scc.c:1783 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1946 scc_net_siocdevprivate() warn: 'hwcfg.vector_latch' from __request_region() not released on lines: 1827.
Old smatch warnings:
drivers/net/hamradio/scc.c:1784 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1785 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1786 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1787 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1788 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1800 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1801 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1802 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1803 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1804 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1822 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1823 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1826 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
vim +/Ivec +1748 drivers/net/hamradio/scc.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 1695
^1da177e4c3f41 Linus Torvalds 2005-04-16 1696 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1697 * SIOCSCCCFG - configure driver arg: (struct scc_hw_config *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1698 * SIOCSCCINI - initialize driver arg: ---
^1da177e4c3f41 Linus Torvalds 2005-04-16 1699 * SIOCSCCCHANINI - initialize channel arg: (struct scc_modem *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1700 * SIOCSCCSMEM - set memory arg: (struct scc_mem_config *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1701 * SIOCSCCGKISS - get level 1 parameter arg: (struct scc_kiss_cmd *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1702 * SIOCSCCSKISS - set level 1 parameter arg: (struct scc_kiss_cmd *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1703 * SIOCSCCGSTAT - get driver status arg: (struct scc_stat *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1704 * SIOCSCCCAL - send calib. pattern arg: (struct scc_calibrate *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1705 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1706
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1707 static int scc_net_siocdevprivate(struct net_device *dev,
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1708 struct ifreq *ifr, void __user *arg, int cmd)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1709 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1710 struct scc_kiss_cmd kiss_cmd;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1711 struct scc_mem_config memcfg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1712 struct scc_hw_config hwcfg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1713 struct scc_calibrate cal;
f4bdd264b43cc6 Wang Chen 2008-11-20 1714 struct scc_channel *scc = (struct scc_channel *) dev->ml_priv;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1715 int chan;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1716 unsigned char device_name[IFNAMSIZ];
^1da177e4c3f41 Linus Torvalds 2005-04-16 1717
^1da177e4c3f41 Linus Torvalds 2005-04-16 1718 if (!Driver_Initialized)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1719 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1720 if (cmd == SIOCSCCCFG)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1721 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1722 int found = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1723
^1da177e4c3f41 Linus Torvalds 2005-04-16 1724 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1725 if (in_compat_syscall())
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1726 return -EOPNOTSUPP;
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1727
^1da177e4c3f41 Linus Torvalds 2005-04-16 1728 if (!arg) return -EFAULT;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1729
^1da177e4c3f41 Linus Torvalds 2005-04-16 1730 if (Nchips >= SCC_MAXCHIPS)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1731 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1732
^1da177e4c3f41 Linus Torvalds 2005-04-16 1733 if (copy_from_user(&hwcfg, arg, sizeof(hwcfg)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1734 return -EFAULT;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1735
^1da177e4c3f41 Linus Torvalds 2005-04-16 1736 if (hwcfg.irq == 2) hwcfg.irq = 9;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1737
60e4ad7a72fd7c Yinghai Lu 2008-08-19 1738 if (hwcfg.irq < 0 || hwcfg.irq >= nr_irqs)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1739 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1740
^1da177e4c3f41 Linus Torvalds 2005-04-16 1741 if (!Ivec[hwcfg.irq].used && hwcfg.irq)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1742 {
1b36efe07f83ec Jeff Garzik 2007-10-29 1743 if (request_irq(hwcfg.irq, scc_isr,
9714481e677562 Michael Opdenacker 2013-10-05 1744 0, "AX.25 SCC",
1b36efe07f83ec Jeff Garzik 2007-10-29 1745 (void *)(long) hwcfg.irq))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1746 printk(KERN_WARNING "z8530drv: warning, cannot get IRQ %d\n", hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1747 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1748 Ivec[hwcfg.irq].used = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1749 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1750
^1da177e4c3f41 Linus Torvalds 2005-04-16 1751 if (hwcfg.vector_latch && !Vector_Latch) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1752 if (!request_region(hwcfg.vector_latch, 1, "scc vector latch"))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1753 printk(KERN_WARNING "z8530drv: warning, cannot reserve vector latch port 0x%lx\n, disabled.", hwcfg.vector_latch);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1754 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1755 Vector_Latch = hwcfg.vector_latch;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1756 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1757
^1da177e4c3f41 Linus Torvalds 2005-04-16 1758 if (hwcfg.clock == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1759 hwcfg.clock = SCC_DEFAULT_CLOCK;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1760
^1da177e4c3f41 Linus Torvalds 2005-04-16 1761 #ifndef SCC_DONT_CHECK
^1da177e4c3f41 Linus Torvalds 2005-04-16 1762
^1da177e4c3f41 Linus Torvalds 2005-04-16 1763 if(request_region(hwcfg.ctrl_a, 1, "scc-probe"))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1764 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1765 disable_irq(hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1766 Outb(hwcfg.ctrl_a, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1767 OutReg(hwcfg.ctrl_a, R9, FHWRES);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1768 udelay(100);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1769 OutReg(hwcfg.ctrl_a,R13,0x55); /* is this chip really there? */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1770 udelay(5);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1771
^1da177e4c3f41 Linus Torvalds 2005-04-16 1772 if (InReg(hwcfg.ctrl_a,R13) != 0x55)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1773 found = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1774 enable_irq(hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1775 release_region(hwcfg.ctrl_a, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1776 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1777 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1778 found = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1779 #endif
^1da177e4c3f41 Linus Torvalds 2005-04-16 1780
^1da177e4c3f41 Linus Torvalds 2005-04-16 1781 if (found)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1782 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1783 SCC_Info[2*Nchips ].ctrl = hwcfg.ctrl_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1784 SCC_Info[2*Nchips ].data = hwcfg.data_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1785 SCC_Info[2*Nchips ].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1786 SCC_Info[2*Nchips+1].ctrl = hwcfg.ctrl_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1787 SCC_Info[2*Nchips+1].data = hwcfg.data_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1788 SCC_Info[2*Nchips+1].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1789
^1da177e4c3f41 Linus Torvalds 2005-04-16 1790 SCC_ctrl[Nchips].chan_A = hwcfg.ctrl_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1791 SCC_ctrl[Nchips].chan_B = hwcfg.ctrl_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1792 SCC_ctrl[Nchips].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1793 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1794
^1da177e4c3f41 Linus Torvalds 2005-04-16 1795
^1da177e4c3f41 Linus Torvalds 2005-04-16 1796 for (chan = 0; chan < 2; chan++)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1797 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1798 sprintf(device_name, "%s%i", SCC_DriverName, 2*Nchips+chan);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1799
^1da177e4c3f41 Linus Torvalds 2005-04-16 1800 SCC_Info[2*Nchips+chan].special = hwcfg.special;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1801 SCC_Info[2*Nchips+chan].clock = hwcfg.clock;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1802 SCC_Info[2*Nchips+chan].brand = hwcfg.brand;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1803 SCC_Info[2*Nchips+chan].option = hwcfg.option;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1804 SCC_Info[2*Nchips+chan].enhanced = hwcfg.escc;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1805
^1da177e4c3f41 Linus Torvalds 2005-04-16 1806 #ifdef SCC_DONT_CHECK
^1da177e4c3f41 Linus Torvalds 2005-04-16 1807 printk(KERN_INFO "%s: data port = 0x%3.3x control port = 0x%3.3x\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 1808 device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1809 SCC_Info[2*Nchips+chan].data,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1810 SCC_Info[2*Nchips+chan].ctrl);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1811
^1da177e4c3f41 Linus Torvalds 2005-04-16 1812 #else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1813 printk(KERN_INFO "%s: data port = 0x%3.3lx control port = 0x%3.3lx -- %s\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 1814 device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1815 chan? hwcfg.data_b : hwcfg.data_a,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1816 chan? hwcfg.ctrl_b : hwcfg.ctrl_a,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1817 found? "found" : "missing");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1818 #endif
^1da177e4c3f41 Linus Torvalds 2005-04-16 1819
^1da177e4c3f41 Linus Torvalds 2005-04-16 1820 if (found)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1821 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1822 request_region(SCC_Info[2*Nchips+chan].ctrl, 1, "scc ctrl");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1823 request_region(SCC_Info[2*Nchips+chan].data, 1, "scc data");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1824 if (Nchips+chan != 0 &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 1825 scc_net_alloc(device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1826 &SCC_Info[2*Nchips+chan]))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1827 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1828 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1829 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1830
^1da177e4c3f41 Linus Torvalds 2005-04-16 1831 if (found) Nchips++;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1832
^1da177e4c3f41 Linus Torvalds 2005-04-16 1833 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1834 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1835
^1da177e4c3f41 Linus Torvalds 2005-04-16 1836 if (cmd == SIOCSCCINI)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1837 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1838 if (!capable(CAP_SYS_RAWIO))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1839 return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1840
^1da177e4c3f41 Linus Torvalds 2005-04-16 1841 if (Nchips == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1842 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1843
^1da177e4c3f41 Linus Torvalds 2005-04-16 1844 z8530_init();
^1da177e4c3f41 Linus Torvalds 2005-04-16 1845 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1846 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1847
^1da177e4c3f41 Linus Torvalds 2005-04-16 1848 return -EINVAL; /* confuse the user */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1849 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1850
^1da177e4c3f41 Linus Torvalds 2005-04-16 1851 if (!scc->init)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1852 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1853 if (cmd == SIOCSCCCHANINI)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1854 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1855 if (!capable(CAP_NET_ADMIN)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1856 if (!arg) return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1857
^1da177e4c3f41 Linus Torvalds 2005-04-16 1858 scc->stat.bufsize = SCC_BUFSIZE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1859
^1da177e4c3f41 Linus Torvalds 2005-04-16 1860 if (copy_from_user(&scc->modem, arg, sizeof(struct scc_modem)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1861 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1862
^1da177e4c3f41 Linus Torvalds 2005-04-16 1863 /* default KISS Params */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1864
^1da177e4c3f41 Linus Torvalds 2005-04-16 1865 if (scc->modem.speed < 4800)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1866 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1867 scc->kiss.txdelay = 36; /* 360 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1868 scc->kiss.persist = 42; /* 25% persistence */ /* was 25 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1869 scc->kiss.slottime = 16; /* 160 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1870 scc->kiss.tailtime = 4; /* minimal reasonable value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1871 scc->kiss.fulldup = 0; /* CSMA */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1872 scc->kiss.waittime = 50; /* 500 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1873 scc->kiss.maxkeyup = 10; /* 10 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1874 scc->kiss.mintime = 3; /* 3 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1875 scc->kiss.idletime = 30; /* 30 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1876 scc->kiss.maxdefer = 120; /* 2 min */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1877 scc->kiss.softdcd = 0; /* hardware dcd */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1878 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1879 scc->kiss.txdelay = 10; /* 100 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1880 scc->kiss.persist = 64; /* 25% persistence */ /* was 25 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1881 scc->kiss.slottime = 8; /* 160 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1882 scc->kiss.tailtime = 1; /* minimal reasonable value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1883 scc->kiss.fulldup = 0; /* CSMA */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1884 scc->kiss.waittime = 50; /* 500 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1885 scc->kiss.maxkeyup = 7; /* 7 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1886 scc->kiss.mintime = 3; /* 3 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1887 scc->kiss.idletime = 30; /* 30 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1888 scc->kiss.maxdefer = 120; /* 2 min */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1889 scc->kiss.softdcd = 0; /* hardware dcd */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1890 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1891
^1da177e4c3f41 Linus Torvalds 2005-04-16 1892 scc->tx_buff = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1893 skb_queue_head_init(&scc->tx_queue);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1894 scc->init = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1895
^1da177e4c3f41 Linus Torvalds 2005-04-16 1896 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1897 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1898
^1da177e4c3f41 Linus Torvalds 2005-04-16 1899 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1900 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1901
^1da177e4c3f41 Linus Torvalds 2005-04-16 1902 switch(cmd)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1903 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1904 case SIOCSCCRESERVED:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1905 return -ENOIOCTLCMD;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1906
^1da177e4c3f41 Linus Torvalds 2005-04-16 1907 case SIOCSCCSMEM:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1908 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1909 if (!arg || copy_from_user(&memcfg, arg, sizeof(memcfg)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1910 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1911 scc->stat.bufsize = memcfg.bufsize;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1912 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1913
^1da177e4c3f41 Linus Torvalds 2005-04-16 1914 case SIOCSCCGSTAT:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1915 if (!arg || copy_to_user(arg, &scc->stat, sizeof(scc->stat)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1916 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1917 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1918
^1da177e4c3f41 Linus Torvalds 2005-04-16 1919 case SIOCSCCGKISS:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1920 if (!arg || copy_from_user(&kiss_cmd, arg, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1921 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1922 kiss_cmd.param = scc_get_param(scc, kiss_cmd.command);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1923 if (copy_to_user(arg, &kiss_cmd, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1924 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1925 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1926
^1da177e4c3f41 Linus Torvalds 2005-04-16 1927 case SIOCSCCSKISS:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1928 if (!capable(CAP_NET_ADMIN)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1929 if (!arg || copy_from_user(&kiss_cmd, arg, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1930 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1931 return scc_set_param(scc, kiss_cmd.command, kiss_cmd.param);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1932
^1da177e4c3f41 Linus Torvalds 2005-04-16 1933 case SIOCSCCCAL:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1934 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1935 if (!arg || copy_from_user(&cal, arg, sizeof(cal)) || cal.time == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1936 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1937
^1da177e4c3f41 Linus Torvalds 2005-04-16 1938 scc_start_calibrate(scc, cal.time, cal.pattern);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1939 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1940
^1da177e4c3f41 Linus Torvalds 2005-04-16 1941 default:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1942 return -ENOIOCTLCMD;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1943
^1da177e4c3f41 Linus Torvalds 2005-04-16 1944 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1945
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1946 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1947 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1948
:::::: The code at line 1748 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread* drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w]
@ 2023-12-12 0:17 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2023-12-12 0:17 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Arnd Bergmann <arnd@arndb.de>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: a39b6ac3781d46ba18193c9dbb2110f31e9bffe9
commit: 25ec92fbdd23a0a2bfd2bdf489e60ea4f0ae46d1 hamradio: use ndo_siocdevprivate
date: 2 years, 5 months ago
:::::: branch date: 26 hours ago
:::::: commit date: 2 years, 5 months ago
config: i386-randconfig-141-20231111 (https://download.01.org/0day-ci/archive/20231212/202312120826.wrConx3j-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20231212/202312120826.wrConx3j-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202312120826.wrConx3j-lkp@intel.com/
New smatch warnings:
drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w]
drivers/net/hamradio/scc.c:1783 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1946 scc_net_siocdevprivate() warn: 'hwcfg.vector_latch' from __request_region() not released on lines: 1827.
Old smatch warnings:
drivers/net/hamradio/scc.c:1784 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1785 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1786 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1787 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1788 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1800 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1801 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1802 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1803 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1804 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1822 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1823 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
drivers/net/hamradio/scc.c:1826 scc_net_siocdevprivate() error: buffer overflow 'SCC_Info' 8 <= s32max
vim +/Ivec +1748 drivers/net/hamradio/scc.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 1695
^1da177e4c3f41 Linus Torvalds 2005-04-16 1696 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1697 * SIOCSCCCFG - configure driver arg: (struct scc_hw_config *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1698 * SIOCSCCINI - initialize driver arg: ---
^1da177e4c3f41 Linus Torvalds 2005-04-16 1699 * SIOCSCCCHANINI - initialize channel arg: (struct scc_modem *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1700 * SIOCSCCSMEM - set memory arg: (struct scc_mem_config *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1701 * SIOCSCCGKISS - get level 1 parameter arg: (struct scc_kiss_cmd *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1702 * SIOCSCCSKISS - set level 1 parameter arg: (struct scc_kiss_cmd *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1703 * SIOCSCCGSTAT - get driver status arg: (struct scc_stat *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1704 * SIOCSCCCAL - send calib. pattern arg: (struct scc_calibrate *) arg
^1da177e4c3f41 Linus Torvalds 2005-04-16 1705 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1706
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1707 static int scc_net_siocdevprivate(struct net_device *dev,
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1708 struct ifreq *ifr, void __user *arg, int cmd)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1709 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1710 struct scc_kiss_cmd kiss_cmd;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1711 struct scc_mem_config memcfg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1712 struct scc_hw_config hwcfg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1713 struct scc_calibrate cal;
f4bdd264b43cc6 Wang Chen 2008-11-20 1714 struct scc_channel *scc = (struct scc_channel *) dev->ml_priv;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1715 int chan;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1716 unsigned char device_name[IFNAMSIZ];
^1da177e4c3f41 Linus Torvalds 2005-04-16 1717
^1da177e4c3f41 Linus Torvalds 2005-04-16 1718 if (!Driver_Initialized)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1719 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1720 if (cmd == SIOCSCCCFG)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1721 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1722 int found = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1723
^1da177e4c3f41 Linus Torvalds 2005-04-16 1724 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1725 if (in_compat_syscall())
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1726 return -EOPNOTSUPP;
25ec92fbdd23a0 Arnd Bergmann 2021-07-27 1727
^1da177e4c3f41 Linus Torvalds 2005-04-16 1728 if (!arg) return -EFAULT;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1729
^1da177e4c3f41 Linus Torvalds 2005-04-16 1730 if (Nchips >= SCC_MAXCHIPS)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1731 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1732
^1da177e4c3f41 Linus Torvalds 2005-04-16 1733 if (copy_from_user(&hwcfg, arg, sizeof(hwcfg)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1734 return -EFAULT;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1735
^1da177e4c3f41 Linus Torvalds 2005-04-16 1736 if (hwcfg.irq == 2) hwcfg.irq = 9;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1737
60e4ad7a72fd7c Yinghai Lu 2008-08-19 1738 if (hwcfg.irq < 0 || hwcfg.irq >= nr_irqs)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1739 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1740
^1da177e4c3f41 Linus Torvalds 2005-04-16 1741 if (!Ivec[hwcfg.irq].used && hwcfg.irq)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1742 {
1b36efe07f83ec Jeff Garzik 2007-10-29 1743 if (request_irq(hwcfg.irq, scc_isr,
9714481e677562 Michael Opdenacker 2013-10-05 1744 0, "AX.25 SCC",
1b36efe07f83ec Jeff Garzik 2007-10-29 1745 (void *)(long) hwcfg.irq))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1746 printk(KERN_WARNING "z8530drv: warning, cannot get IRQ %d\n", hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1747 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1748 Ivec[hwcfg.irq].used = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1749 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1750
^1da177e4c3f41 Linus Torvalds 2005-04-16 1751 if (hwcfg.vector_latch && !Vector_Latch) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1752 if (!request_region(hwcfg.vector_latch, 1, "scc vector latch"))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1753 printk(KERN_WARNING "z8530drv: warning, cannot reserve vector latch port 0x%lx\n, disabled.", hwcfg.vector_latch);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1754 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1755 Vector_Latch = hwcfg.vector_latch;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1756 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1757
^1da177e4c3f41 Linus Torvalds 2005-04-16 1758 if (hwcfg.clock == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1759 hwcfg.clock = SCC_DEFAULT_CLOCK;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1760
^1da177e4c3f41 Linus Torvalds 2005-04-16 1761 #ifndef SCC_DONT_CHECK
^1da177e4c3f41 Linus Torvalds 2005-04-16 1762
^1da177e4c3f41 Linus Torvalds 2005-04-16 1763 if(request_region(hwcfg.ctrl_a, 1, "scc-probe"))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1764 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1765 disable_irq(hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1766 Outb(hwcfg.ctrl_a, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1767 OutReg(hwcfg.ctrl_a, R9, FHWRES);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1768 udelay(100);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1769 OutReg(hwcfg.ctrl_a,R13,0x55); /* is this chip really there? */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1770 udelay(5);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1771
^1da177e4c3f41 Linus Torvalds 2005-04-16 1772 if (InReg(hwcfg.ctrl_a,R13) != 0x55)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1773 found = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1774 enable_irq(hwcfg.irq);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1775 release_region(hwcfg.ctrl_a, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1776 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1777 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1778 found = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1779 #endif
^1da177e4c3f41 Linus Torvalds 2005-04-16 1780
^1da177e4c3f41 Linus Torvalds 2005-04-16 1781 if (found)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1782 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1783 SCC_Info[2*Nchips ].ctrl = hwcfg.ctrl_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1784 SCC_Info[2*Nchips ].data = hwcfg.data_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1785 SCC_Info[2*Nchips ].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1786 SCC_Info[2*Nchips+1].ctrl = hwcfg.ctrl_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1787 SCC_Info[2*Nchips+1].data = hwcfg.data_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1788 SCC_Info[2*Nchips+1].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1789
^1da177e4c3f41 Linus Torvalds 2005-04-16 1790 SCC_ctrl[Nchips].chan_A = hwcfg.ctrl_a;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1791 SCC_ctrl[Nchips].chan_B = hwcfg.ctrl_b;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1792 SCC_ctrl[Nchips].irq = hwcfg.irq;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1793 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1794
^1da177e4c3f41 Linus Torvalds 2005-04-16 1795
^1da177e4c3f41 Linus Torvalds 2005-04-16 1796 for (chan = 0; chan < 2; chan++)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1797 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1798 sprintf(device_name, "%s%i", SCC_DriverName, 2*Nchips+chan);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1799
^1da177e4c3f41 Linus Torvalds 2005-04-16 1800 SCC_Info[2*Nchips+chan].special = hwcfg.special;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1801 SCC_Info[2*Nchips+chan].clock = hwcfg.clock;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1802 SCC_Info[2*Nchips+chan].brand = hwcfg.brand;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1803 SCC_Info[2*Nchips+chan].option = hwcfg.option;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1804 SCC_Info[2*Nchips+chan].enhanced = hwcfg.escc;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1805
^1da177e4c3f41 Linus Torvalds 2005-04-16 1806 #ifdef SCC_DONT_CHECK
^1da177e4c3f41 Linus Torvalds 2005-04-16 1807 printk(KERN_INFO "%s: data port = 0x%3.3x control port = 0x%3.3x\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 1808 device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1809 SCC_Info[2*Nchips+chan].data,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1810 SCC_Info[2*Nchips+chan].ctrl);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1811
^1da177e4c3f41 Linus Torvalds 2005-04-16 1812 #else
^1da177e4c3f41 Linus Torvalds 2005-04-16 1813 printk(KERN_INFO "%s: data port = 0x%3.3lx control port = 0x%3.3lx -- %s\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 1814 device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1815 chan? hwcfg.data_b : hwcfg.data_a,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1816 chan? hwcfg.ctrl_b : hwcfg.ctrl_a,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1817 found? "found" : "missing");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1818 #endif
^1da177e4c3f41 Linus Torvalds 2005-04-16 1819
^1da177e4c3f41 Linus Torvalds 2005-04-16 1820 if (found)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1821 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1822 request_region(SCC_Info[2*Nchips+chan].ctrl, 1, "scc ctrl");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1823 request_region(SCC_Info[2*Nchips+chan].data, 1, "scc data");
^1da177e4c3f41 Linus Torvalds 2005-04-16 1824 if (Nchips+chan != 0 &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 1825 scc_net_alloc(device_name,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1826 &SCC_Info[2*Nchips+chan]))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1827 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1828 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1829 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1830
^1da177e4c3f41 Linus Torvalds 2005-04-16 1831 if (found) Nchips++;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1832
^1da177e4c3f41 Linus Torvalds 2005-04-16 1833 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1834 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1835
^1da177e4c3f41 Linus Torvalds 2005-04-16 1836 if (cmd == SIOCSCCINI)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1837 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1838 if (!capable(CAP_SYS_RAWIO))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1839 return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1840
^1da177e4c3f41 Linus Torvalds 2005-04-16 1841 if (Nchips == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1842 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1843
^1da177e4c3f41 Linus Torvalds 2005-04-16 1844 z8530_init();
^1da177e4c3f41 Linus Torvalds 2005-04-16 1845 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1846 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1847
^1da177e4c3f41 Linus Torvalds 2005-04-16 1848 return -EINVAL; /* confuse the user */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1849 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1850
^1da177e4c3f41 Linus Torvalds 2005-04-16 1851 if (!scc->init)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1852 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1853 if (cmd == SIOCSCCCHANINI)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1854 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1855 if (!capable(CAP_NET_ADMIN)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1856 if (!arg) return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1857
^1da177e4c3f41 Linus Torvalds 2005-04-16 1858 scc->stat.bufsize = SCC_BUFSIZE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1859
^1da177e4c3f41 Linus Torvalds 2005-04-16 1860 if (copy_from_user(&scc->modem, arg, sizeof(struct scc_modem)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1861 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1862
^1da177e4c3f41 Linus Torvalds 2005-04-16 1863 /* default KISS Params */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1864
^1da177e4c3f41 Linus Torvalds 2005-04-16 1865 if (scc->modem.speed < 4800)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1866 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1867 scc->kiss.txdelay = 36; /* 360 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1868 scc->kiss.persist = 42; /* 25% persistence */ /* was 25 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1869 scc->kiss.slottime = 16; /* 160 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1870 scc->kiss.tailtime = 4; /* minimal reasonable value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1871 scc->kiss.fulldup = 0; /* CSMA */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1872 scc->kiss.waittime = 50; /* 500 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1873 scc->kiss.maxkeyup = 10; /* 10 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1874 scc->kiss.mintime = 3; /* 3 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1875 scc->kiss.idletime = 30; /* 30 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1876 scc->kiss.maxdefer = 120; /* 2 min */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1877 scc->kiss.softdcd = 0; /* hardware dcd */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1878 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1879 scc->kiss.txdelay = 10; /* 100 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1880 scc->kiss.persist = 64; /* 25% persistence */ /* was 25 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1881 scc->kiss.slottime = 8; /* 160 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1882 scc->kiss.tailtime = 1; /* minimal reasonable value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1883 scc->kiss.fulldup = 0; /* CSMA */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1884 scc->kiss.waittime = 50; /* 500 ms */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1885 scc->kiss.maxkeyup = 7; /* 7 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1886 scc->kiss.mintime = 3; /* 3 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1887 scc->kiss.idletime = 30; /* 30 s */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1888 scc->kiss.maxdefer = 120; /* 2 min */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1889 scc->kiss.softdcd = 0; /* hardware dcd */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1890 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1891
^1da177e4c3f41 Linus Torvalds 2005-04-16 1892 scc->tx_buff = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1893 skb_queue_head_init(&scc->tx_queue);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1894 scc->init = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1895
^1da177e4c3f41 Linus Torvalds 2005-04-16 1896 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1897 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1898
^1da177e4c3f41 Linus Torvalds 2005-04-16 1899 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1900 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1901
^1da177e4c3f41 Linus Torvalds 2005-04-16 1902 switch(cmd)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1903 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1904 case SIOCSCCRESERVED:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1905 return -ENOIOCTLCMD;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1906
^1da177e4c3f41 Linus Torvalds 2005-04-16 1907 case SIOCSCCSMEM:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1908 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1909 if (!arg || copy_from_user(&memcfg, arg, sizeof(memcfg)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1910 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1911 scc->stat.bufsize = memcfg.bufsize;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1912 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1913
^1da177e4c3f41 Linus Torvalds 2005-04-16 1914 case SIOCSCCGSTAT:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1915 if (!arg || copy_to_user(arg, &scc->stat, sizeof(scc->stat)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1916 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1917 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1918
^1da177e4c3f41 Linus Torvalds 2005-04-16 1919 case SIOCSCCGKISS:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1920 if (!arg || copy_from_user(&kiss_cmd, arg, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1921 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1922 kiss_cmd.param = scc_get_param(scc, kiss_cmd.command);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1923 if (copy_to_user(arg, &kiss_cmd, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1924 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1925 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1926
^1da177e4c3f41 Linus Torvalds 2005-04-16 1927 case SIOCSCCSKISS:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1928 if (!capable(CAP_NET_ADMIN)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1929 if (!arg || copy_from_user(&kiss_cmd, arg, sizeof(kiss_cmd)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 1930 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1931 return scc_set_param(scc, kiss_cmd.command, kiss_cmd.param);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1932
^1da177e4c3f41 Linus Torvalds 2005-04-16 1933 case SIOCSCCCAL:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1934 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1935 if (!arg || copy_from_user(&cal, arg, sizeof(cal)) || cal.time == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1936 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1937
^1da177e4c3f41 Linus Torvalds 2005-04-16 1938 scc_start_calibrate(scc, cal.time, cal.pattern);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1939 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1940
^1da177e4c3f41 Linus Torvalds 2005-04-16 1941 default:
^1da177e4c3f41 Linus Torvalds 2005-04-16 1942 return -ENOIOCTLCMD;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1943
^1da177e4c3f41 Linus Torvalds 2005-04-16 1944 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1945
^1da177e4c3f41 Linus Torvalds 2005-04-16 @1946 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1947 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1948
:::::: The code at line 1748 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-12-13 15:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-12 18:43 drivers/net/hamradio/scc.c:1748 scc_net_siocdevprivate() warn: potential spectre issue 'Ivec' [w] kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2023-12-13 15:16 kernel test robot
2023-12-12 0:17 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.