<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=NVIDIA_%D0%BF%D0%B0%D1%82%D1%87_%D0%B4%D0%BB%D1%8F_%D1%8F%D0%B4%D1%80%D0%B0_3.10.x</id>
	<title>NVIDIA патч для ядра 3.10.x - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=NVIDIA_%D0%BF%D0%B0%D1%82%D1%87_%D0%B4%D0%BB%D1%8F_%D1%8F%D0%B4%D1%80%D0%B0_3.10.x"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=NVIDIA_%D0%BF%D0%B0%D1%82%D1%87_%D0%B4%D0%BB%D1%8F_%D1%8F%D0%B4%D1%80%D0%B0_3.10.x&amp;action=history"/>
	<updated>2026-04-03T17:24:23Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=NVIDIA_%D0%BF%D0%B0%D1%82%D1%87_%D0%B4%D0%BB%D1%8F_%D1%8F%D0%B4%D1%80%D0%B0_3.10.x&amp;diff=781&amp;oldid=prev</id>
		<title>imported&gt;Vix: Новая страница: «==Патч==  &lt;nowiki&gt; diff -ur -X - NVIDIA-Linux-x86_64-319.17-no-compat32.orig/kernel/nv-i2c.c NVIDIA-Linux-x86_64-319.17-no-compat32/kernel/nv-i2c.c           …»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=NVIDIA_%D0%BF%D0%B0%D1%82%D1%87_%D0%B4%D0%BB%D1%8F_%D1%8F%D0%B4%D1%80%D0%B0_3.10.x&amp;diff=781&amp;oldid=prev"/>
		<updated>2013-08-31T23:34:05Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «==Патч==  &amp;lt;nowiki&amp;gt; diff -ur -X - NVIDIA-Linux-x86_64-319.17-no-compat32.orig/kernel/nv-i2c.c NVIDIA-Linux-x86_64-319.17-no-compat32/kernel/nv-i2c.c           …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Патч==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff -ur -X - NVIDIA-Linux-x86_64-319.17-no-compat32.orig/kernel/nv-i2c.c NVIDIA-Linux-x86_64-319.17-no-compat32/kernel/nv-i2c.c                                                    &lt;br /&gt;
--- NVIDIA-Linux-x86_64-319.17-no-compat32.orig/kernel/nv-i2c.c 2013-04-26 00:22:30.000000000 -0400                                                                                 &lt;br /&gt;
+++ NVIDIA-Linux-x86_64-319.17-no-compat32/kernel/nv-i2c.c      2013-05-13 05:20:55.571981365 -0400                                                                                 &lt;br /&gt;
@@ -311,8 +311,6 @@                                                                                                                                                                 &lt;br /&gt;
 BOOL NV_API_CALL nv_i2c_del_adapter(nv_state_t *nv, void *data)                                                                                                                    &lt;br /&gt;
 {                                                                                                                                                                                  &lt;br /&gt;
     struct i2c_adapter *pI2cAdapter = (struct i2c_adapter *)data;                                                                                                                  &lt;br /&gt;
-    int osstatus = 0;                                                                                                                                                              &lt;br /&gt;
-    BOOL wasReleased = FALSE;                                                                                                                                                      &lt;br /&gt;
                                                                                                                                                                                    &lt;br /&gt;
 #if defined(KERNEL_2_4)                                                                                                                                                            &lt;br /&gt;
     if (!NV_WEAK_SYMBOL_PRESENT(i2c_add_adapter))                                                                                                                                  &lt;br /&gt;
@@ -324,15 +322,10 @@                                                                                                                                                               &lt;br /&gt;
     if (!pI2cAdapter) return FALSE;                                                                                                                                                &lt;br /&gt;
                                                                                                                                                                                    &lt;br /&gt;
     // attempt release with the OS                                                                                                                                                 &lt;br /&gt;
-    osstatus = i2c_del_adapter(pI2cAdapter);                                                                                                                                       &lt;br /&gt;
+    i2c_del_adapter(pI2cAdapter);                                                                                                                                                  &lt;br /&gt;
+    os_free_mem(pI2cAdapter);                                                                                                                                                      &lt;br /&gt;
                                                                                                                                                                                    &lt;br /&gt;
-    if (!osstatus)                                                                                                                                                                 &lt;br /&gt;
-    {                                                                                                                                                                              &lt;br /&gt;
-        os_free_mem(pI2cAdapter);&lt;br /&gt;
-        wasReleased = TRUE;&lt;br /&gt;
-    }&lt;br /&gt;
-&lt;br /&gt;
-    return wasReleased;&lt;br /&gt;
+    return TRUE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #else // (defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE))&lt;br /&gt;
diff -ur -X - NVIDIA-Linux-x86_64-319.17-no-compat32.orig/kernel/nv-procfs.c NVIDIA-Linux-x86_64-319.17-no-compat32/kernel/nv-procfs.c&lt;br /&gt;
--- NVIDIA-Linux-x86_64-319.17-no-compat32.orig/kernel/nv-procfs.c      2013-04-26 00:22:30.000000000 -0400&lt;br /&gt;
+++ NVIDIA-Linux-x86_64-319.17-no-compat32/kernel/nv-procfs.c   2013-05-22 04:52:45.229495748 -0400&lt;br /&gt;
@@ -60,60 +60,41 @@&lt;br /&gt;
         __entry;                                          \&lt;br /&gt;
     })&lt;br /&gt;
 &lt;br /&gt;
-#define NV_CREATE_PROC_FILE(name,parent,__read_proc,           \&lt;br /&gt;
-    __write_proc,__fops,__data)                                \&lt;br /&gt;
-   ({                                                          \&lt;br /&gt;
-        struct proc_dir_entry *__entry;                        \&lt;br /&gt;
-        int __mode = (S_IFREG | S_IRUGO);                      \&lt;br /&gt;
-        if ((NvUPtr)(__write_proc) != 0)                       \&lt;br /&gt;
-            __mode |= S_IWUSR;                                 \&lt;br /&gt;
-        __entry = NV_CREATE_PROC_ENTRY(name, __mode, parent);  \&lt;br /&gt;
-        if (__entry != NULL)                                   \&lt;br /&gt;
-        {                                                      \&lt;br /&gt;
-            if ((NvUPtr)(__read_proc) != 0)                    \&lt;br /&gt;
-                __entry-&amp;gt;read_proc = (__read_proc);            \&lt;br /&gt;
-            if ((NvUPtr)(__write_proc) != 0)                   \&lt;br /&gt;
-            {                                                  \&lt;br /&gt;
-                __entry-&amp;gt;write_proc = (__write_proc);          \&lt;br /&gt;
-                __entry-&amp;gt;proc_fops = (__fops);                 \&lt;br /&gt;
-            }                                                  \&lt;br /&gt;
-            __entry-&amp;gt;data = (__data);                          \&lt;br /&gt;
-        }                                                      \&lt;br /&gt;
-        __entry;                                               \&lt;br /&gt;
-    })&lt;br /&gt;
+#define NV_PROC_RW (S_IFREG|S_IRUGO|S_IWUSR)&lt;br /&gt;
+#define NV_PROC_RO (S_IFREG|S_IRUGO)&lt;br /&gt;
 &lt;br /&gt;
 #define NV_CREATE_PROC_DIR(name,parent)                        \&lt;br /&gt;
    ({                                                          \&lt;br /&gt;
         struct proc_dir_entry *__entry;                        \&lt;br /&gt;
         int __mode = (S_IFDIR | S_IRUGO | S_IXUGO);            \&lt;br /&gt;
-        __entry = NV_CREATE_PROC_ENTRY(name, __mode, parent);  \&lt;br /&gt;
+        __entry = proc_mkdir_mode(name, __mode, parent);       \&lt;br /&gt;
         __entry;                                               \&lt;br /&gt;
     })&lt;br /&gt;
 &lt;br /&gt;
+#if LINUX_VERSION_CODE &amp;lt;= KERNEL_VERSION(3,9,255)&lt;br /&gt;
+static inline void *PDE_DATA(const struct inode *inode) {&lt;br /&gt;
+       return PDE(inode)-&amp;gt;data;&lt;br /&gt;
+}&lt;br /&gt;
+#endif&lt;br /&gt;
+&lt;br /&gt;
 #define NV_PROC_WRITE_BUFFER_SIZE   (64 * RM_PAGE_SIZE)&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
-nv_procfs_read_gpu_info(&lt;br /&gt;
-    char  *page,&lt;br /&gt;
-    char **start,&lt;br /&gt;
-    off_t  off,&lt;br /&gt;
-    int    count,&lt;br /&gt;
-    int   *eof,&lt;br /&gt;
-    void  *data&lt;br /&gt;
+nv_procfs_show_gpu_info(&lt;br /&gt;
+    struct seq_file *m,&lt;br /&gt;
+    void *v&lt;br /&gt;
 )&lt;br /&gt;
 {&lt;br /&gt;
-    nv_state_t *nv = data;&lt;br /&gt;
+    nv_state_t *nv = m-&amp;gt;private;&lt;br /&gt;
     nv_linux_state_t *nvl = NV_GET_NVL_FROM_NV_STATE(nv);&lt;br /&gt;
     struct pci_dev *dev = nvl-&amp;gt;dev;&lt;br /&gt;
     char *type, *fmt, tmpstr[NV_DEVICE_NAME_LENGTH];&lt;br /&gt;
-    int len = 0, status;&lt;br /&gt;
+    int status;&lt;br /&gt;
     NvU8 *uuid;&lt;br /&gt;
     NvU32 vbios_rev1, vbios_rev2, vbios_rev3, vbios_rev4, vbios_rev5;&lt;br /&gt;
     NvU32 fpga_rev1, fpga_rev2, fpga_rev3;&lt;br /&gt;
     nv_stack_t *sp = NULL;&lt;br /&gt;
 &lt;br /&gt;
-    *eof = 1;&lt;br /&gt;
-&lt;br /&gt;
     NV_KMEM_CACHE_ALLOC_STACK(sp);&lt;br /&gt;
     if (sp == NULL)&lt;br /&gt;
     {&lt;br /&gt;
@@ -134,31 +115,31 @@&lt;br /&gt;
         if (rm_get_device_name(sp, nv, dev-&amp;gt;device, dev-&amp;gt;subsystem_vendor,&lt;br /&gt;
                     dev-&amp;gt;subsystem_device, NV_DEVICE_NAME_LENGTH,&lt;br /&gt;
                     tmpstr) != RM_OK)&lt;br /&gt;
-        {&lt;br /&gt;
+                      {&lt;br /&gt;
             strcpy (tmpstr, &amp;quot;Unknown&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;Model: \t\t %s\n&amp;quot;, tmpstr);&lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;IRQ:   \t\t %d\n&amp;quot;, nv-&amp;gt;interrupt_line);&lt;br /&gt;
+    seq_printf(m, &amp;quot;Model: \t\t %s\n&amp;quot;, tmpstr);&lt;br /&gt;
+    seq_printf(m, &amp;quot;IRQ:   \t\t %d\n&amp;quot;, nv-&amp;gt;interrupt_line);&lt;br /&gt;
 &lt;br /&gt;
     if (NV_IS_GVI_DEVICE(nv))&lt;br /&gt;
     {&lt;br /&gt;
         status = rm_gvi_get_firmware_version(sp, nv, &amp;amp;fpga_rev1, &amp;amp;fpga_rev2,&lt;br /&gt;
                                              &amp;amp;fpga_rev3);&lt;br /&gt;
         if (status != RM_OK)&lt;br /&gt;
-            len += sprintf(page+len, &amp;quot;Firmware: \t ????.??.??\n&amp;quot;);&lt;br /&gt;
+            seq_printf(m, &amp;quot;Firmware: \t ????.??.??\n&amp;quot;);&lt;br /&gt;
         else&lt;br /&gt;
         {&lt;br /&gt;
             fmt = &amp;quot;Firmware: \t %x.%x.%x\n&amp;quot;;&lt;br /&gt;
-            len += sprintf(page+len, fmt, fpga_rev1, fpga_rev2, fpga_rev3);&lt;br /&gt;
+            seq_printf(m, fmt, fpga_rev1, fpga_rev2, fpga_rev3);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         if (rm_get_gpu_uuid(sp, nv, &amp;amp;uuid, NULL) == RM_OK)&lt;br /&gt;
         {&lt;br /&gt;
-            len += sprintf(page+len, &amp;quot;GPU UUID: \t %s\n&amp;quot;, (char *)uuid);&lt;br /&gt;
+            seq_printf(m, &amp;quot;GPU UUID: \t %s\n&amp;quot;, (char *)uuid);&lt;br /&gt;
             os_free_mem(uuid);&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
@@ -166,12 +147,12 @@&lt;br /&gt;
                     &amp;amp;vbios_rev3, &amp;amp;vbios_rev4,&lt;br /&gt;
                     &amp;amp;vbios_rev5) != RM_OK)&lt;br /&gt;
         {&lt;br /&gt;
-            len += sprintf(page+len, &amp;quot;Video BIOS: \t ??.??.??.??.??\n&amp;quot;);&lt;br /&gt;
+            seq_printf(m, &amp;quot;Video BIOS: \t ??.??.??.??.??\n&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
         else&lt;br /&gt;
         {&lt;br /&gt;
             fmt = &amp;quot;Video BIOS: \t %02x.%02x.%02x.%02x.%02x\n&amp;quot;;&lt;br /&gt;
-            len += sprintf(page+len, fmt, vbios_rev1, vbios_rev2, vbios_rev3,&lt;br /&gt;
+            seq_printf(m, fmt, vbios_rev1, vbios_rev2, vbios_rev3,&lt;br /&gt;
                            vbios_rev4, vbios_rev5);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
@@ -180,12 +161,12 @@&lt;br /&gt;
         type = &amp;quot;PCI-E&amp;quot;;&lt;br /&gt;
     else&lt;br /&gt;
         type = &amp;quot;PCI&amp;quot;;&lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;Bus Type: \t %s\n&amp;quot;, type);&lt;br /&gt;
+    seq_printf(m, &amp;quot;Bus Type: \t %s\n&amp;quot;, type);&lt;br /&gt;
 &lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;DMA Size: \t %d bits\n&amp;quot;,&lt;br /&gt;
+    seq_printf(m, &amp;quot;DMA Size: \t %d bits\n&amp;quot;,&lt;br /&gt;
      nv_count_bits(dev-&amp;gt;dma_mask));&lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;DMA Mask: \t 0x%llx\n&amp;quot;, dev-&amp;gt;dma_mask);&lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;Bus Location: \t %04x:%02x.%02x.%x\n&amp;quot;,&lt;br /&gt;
+    seq_printf(m, &amp;quot;DMA Mask: \t 0x%llx\n&amp;quot;, dev-&amp;gt;dma_mask);&lt;br /&gt;
+    seq_printf(m, &amp;quot;Bus Location: \t %04x:%02x.%02x.%x\n&amp;quot;,&lt;br /&gt;
                    nv-&amp;gt;domain, nv-&amp;gt;bus, nv-&amp;gt;slot, PCI_FUNC(dev-&amp;gt;devfn));&lt;br /&gt;
 #if defined(DEBUG)&lt;br /&gt;
     do&lt;br /&gt;
@@ -193,7 +174,7 @@&lt;br /&gt;
         int j;&lt;br /&gt;
         for (j = 0; j &amp;lt; NV_GPU_NUM_BARS; j++)&lt;br /&gt;
         {&lt;br /&gt;
-            len += sprintf(page+len, &amp;quot;BAR%u: \t\t 0x%llx (%lluMB)\n&amp;quot;,&lt;br /&gt;
+            seq_printf(m, &amp;quot;BAR%u: \t\t 0x%llx (%lluMB)\n&amp;quot;,&lt;br /&gt;
                            j, nv-&amp;gt;bars[j].address, (nv-&amp;gt;bars[j].size &amp;gt;&amp;gt; 20));&lt;br /&gt;
         }&lt;br /&gt;
     } while (0);&lt;br /&gt;
@@ -201,26 +182,120 @@&lt;br /&gt;
 &lt;br /&gt;
     NV_KMEM_CACHE_FREE_STACK(sp);&lt;br /&gt;
 &lt;br /&gt;
-    return len;&lt;br /&gt;
+    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
-nv_procfs_read_version(&lt;br /&gt;
-    char  *page,&lt;br /&gt;
-    char **start,&lt;br /&gt;
-    off_t  off,&lt;br /&gt;
-    int    count,&lt;br /&gt;
-    int   *eof,&lt;br /&gt;
-    void  *data&lt;br /&gt;
+nv_procfs_open_gpu_info(&lt;br /&gt;
+    struct inode *inode,&lt;br /&gt;
+    struct file *file&lt;br /&gt;
+)&lt;br /&gt;
+{&lt;br /&gt;
+    return single_open(file, nv_procfs_show_gpu_info, PDE_DATA(inode));&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+static const struct file_operations nv_procfs_gpu_info_fops = {&lt;br /&gt;
+    .owner   = THIS_MODULE,&lt;br /&gt;
+    .open    = nv_procfs_open_gpu_info,&lt;br /&gt;
+    .read    = seq_read,&lt;br /&gt;
+    .llseek  = seq_lseek,&lt;br /&gt;
+    .release = single_release,&lt;br /&gt;
+};&lt;br /&gt;
+&lt;br /&gt;
+static int&lt;br /&gt;
+nv_procfs_show_version(&lt;br /&gt;
+    struct seq_file *m,&lt;br /&gt;
+    void *v&lt;br /&gt;
+)&lt;br /&gt;
+{&lt;br /&gt;
+    seq_printf(m, &amp;quot;NVRM version: %s\n&amp;quot;, pNVRM_ID);&lt;br /&gt;
+    seq_printf(m, &amp;quot;GCC version:  %s\n&amp;quot;, NV_COMPILER);&lt;br /&gt;
+&lt;br /&gt;
+    return 0;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+static int&lt;br /&gt;
+nv_procfs_open_version(&lt;br /&gt;
+    struct inode *inode,&lt;br /&gt;
+    struct file *file&lt;br /&gt;
+)&lt;br /&gt;
+{&lt;br /&gt;
+    return single_open(file, nv_procfs_show_version, NULL);&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+static const struct file_operations nv_procfs_version_fops = {&lt;br /&gt;
+    .owner   = THIS_MODULE,&lt;br /&gt;
+    .open    = nv_procfs_open_version,&lt;br /&gt;
+    .read    = seq_read,&lt;br /&gt;
+    .llseek  = seq_lseek,&lt;br /&gt;
+    .release = single_release,&lt;br /&gt;
+};&lt;br /&gt;
+&lt;br /&gt;
+static int&lt;br /&gt;
+nv_procfs_show_registry(&lt;br /&gt;
+    struct seq_file *m,&lt;br /&gt;
+    void *v&lt;br /&gt;
+)&lt;br /&gt;
+{&lt;br /&gt;
+    nv_state_t *nv = m-&amp;gt;private;&lt;br /&gt;
+    nv_linux_state_t *nvl = NULL;&lt;br /&gt;
+    char *registry_keys;&lt;br /&gt;
+&lt;br /&gt;
+    if (nv != NULL)&lt;br /&gt;
+        nvl = NV_GET_NVL_FROM_NV_STATE(nv);&lt;br /&gt;
+    registry_keys = ((nvl != NULL) ?&lt;br /&gt;
+            nvl-&amp;gt;registry_keys : nv_registry_keys);&lt;br /&gt;
+&lt;br /&gt;
+    seq_printf(m, &amp;quot;Binary: \&amp;quot;%s\&amp;quot;\n&amp;quot;, registry_keys);&lt;br /&gt;
+&lt;br /&gt;
+    return 0;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+static ssize_t&lt;br /&gt;
+nv_procfs_write_registry(&lt;br /&gt;
+    struct file       *file,&lt;br /&gt;
+    const char __user *buffer,&lt;br /&gt;
+    size_t             count,&lt;br /&gt;
+    loff_t            *pos&lt;br /&gt;
 )&lt;br /&gt;
 {&lt;br /&gt;
-    int len = 0;&lt;br /&gt;
-    *eof = 1;&lt;br /&gt;
+    int status = 0;&lt;br /&gt;
+    nv_file_private_t *nvfp = NV_GET_FILE_PRIVATE(file);&lt;br /&gt;
+    char *proc_buffer;&lt;br /&gt;
+    unsigned long bytes_left;&lt;br /&gt;
+&lt;br /&gt;
+    down(&amp;amp;nvfp-&amp;gt;fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);&lt;br /&gt;
+&lt;br /&gt;
+    bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp-&amp;gt;off - 1);&lt;br /&gt;
+&lt;br /&gt;
+    if (count == 0)&lt;br /&gt;
+    {&lt;br /&gt;
+        status = -EINVAL;&lt;br /&gt;
+        goto done;&lt;br /&gt;
+    }&lt;br /&gt;
+    else if ((bytes_left == 0) || (count &amp;gt; bytes_left))&lt;br /&gt;
+    {&lt;br /&gt;
+        status = -ENOSPC;&lt;br /&gt;
+        goto done;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    proc_buffer = &amp;amp;((char *)nvfp-&amp;gt;data)[nvfp-&amp;gt;off];&lt;br /&gt;
+&lt;br /&gt;
+    if (copy_from_user(proc_buffer, buffer, count))&lt;br /&gt;
+    {&lt;br /&gt;
+        nv_printf(NV_DBG_ERRORS, &amp;quot;NVRM: failed to copy in proc data!\n&amp;quot;);&lt;br /&gt;
+        status = -EFAULT;&lt;br /&gt;
+    }&lt;br /&gt;
+    else&lt;br /&gt;
+    {&lt;br /&gt;
+        nvfp-&amp;gt;proc_data = PDE_DATA(file-&amp;gt;f_inode);&lt;br /&gt;
+        nvfp-&amp;gt;off += count;&lt;br /&gt;
+    }&lt;br /&gt;
 &lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;NVRM version: %s\n&amp;quot;, pNVRM_ID);&lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;GCC version:  %s\n&amp;quot;, NV_COMPILER);&lt;br /&gt;
+done:&lt;br /&gt;
+    up(&amp;amp;nvfp-&amp;gt;fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);&lt;br /&gt;
 &lt;br /&gt;
-    return len;&lt;br /&gt;
+    return ((status &amp;lt; 0) ? status : count);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
@@ -233,7 +308,7 @@&lt;br /&gt;
     nv_stack_t *sp = NULL;&lt;br /&gt;
 &lt;br /&gt;
     if (0 == (file-&amp;gt;f_mode &amp;amp; FMODE_WRITE))&lt;br /&gt;
-        return 0;&lt;br /&gt;
+        return single_open(file, nv_procfs_show_registry, PDE_DATA(inode));&lt;br /&gt;
 &lt;br /&gt;
     nvfp = nv_alloc_file_private();&lt;br /&gt;
     if (nvfp == NULL)&lt;br /&gt;
@@ -282,6 +357,9 @@&lt;br /&gt;
     RM_STATUS rm_status;&lt;br /&gt;
     int rc = 0;&lt;br /&gt;
 &lt;br /&gt;
+    if (0 == (file-&amp;gt;f_mode &amp;amp; FMODE_WRITE))&lt;br /&gt;
+        return single_release(inode, file);&lt;br /&gt;
+&lt;br /&gt;
     nvfp = NV_GET_FILE_PRIVATE(file);&lt;br /&gt;
     if (nvfp == NULL)&lt;br /&gt;
         return 0;&lt;br /&gt;
@@ -346,122 +424,81 @@&lt;br /&gt;
     return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-static struct file_operations nv_procfs_registry_fops = {&lt;br /&gt;
+static const struct file_operations nv_procfs_registry_fops = {&lt;br /&gt;
     .open    = nv_procfs_open_registry,&lt;br /&gt;
+    .read    = seq_read,&lt;br /&gt;
+    .llseek  = seq_lseek,&lt;br /&gt;
+    .write   = nv_procfs_write_registry,&lt;br /&gt;
     .release = nv_procfs_close_registry,&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
-nv_procfs_read_params(&lt;br /&gt;
-    char  *page,&lt;br /&gt;
-    char **start,&lt;br /&gt;
-    off_t  off,&lt;br /&gt;
-    int    count,&lt;br /&gt;
-    int   *eof,&lt;br /&gt;
-    void  *data&lt;br /&gt;
+nv_procfs_show_params(&lt;br /&gt;
+    struct seq_file *m,&lt;br /&gt;
+    void *v&lt;br /&gt;
 )&lt;br /&gt;
 {&lt;br /&gt;
     unsigned int i;&lt;br /&gt;
-    int len = 0;&lt;br /&gt;
     nv_parm_t *entry;&lt;br /&gt;
 &lt;br /&gt;
-    *eof = 1;&lt;br /&gt;
 &lt;br /&gt;
     for (i = 0; (entry = &amp;amp;nv_parms[i])-&amp;gt;name != NULL; i++)&lt;br /&gt;
-        len += sprintf(page+len, &amp;quot;%s: %u\n&amp;quot;, entry-&amp;gt;name, *entry-&amp;gt;data);&lt;br /&gt;
+        seq_printf(m, &amp;quot;%s: %u\n&amp;quot;, entry-&amp;gt;name, *entry-&amp;gt;data);&lt;br /&gt;
 &lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;RegistryDwords: \&amp;quot;%s\&amp;quot;\n&amp;quot;,&lt;br /&gt;
+    seq_printf(m, &amp;quot;RegistryDwords: \&amp;quot;%s\&amp;quot;\n&amp;quot;,&lt;br /&gt;
                 (NVreg_RegistryDwords != NULL) ? NVreg_RegistryDwords : &amp;quot;&amp;quot;);&lt;br /&gt;
-    len += sprintf(page+len, &amp;quot;RmMsg: \&amp;quot;%s\&amp;quot;\n&amp;quot;,&lt;br /&gt;
+    seq_printf(m, &amp;quot;RmMsg: \&amp;quot;%s\&amp;quot;\n&amp;quot;,&lt;br /&gt;
                 (NVreg_RmMsg != NULL) ? NVreg_RmMsg : &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
-    return len;&lt;br /&gt;
+    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
-nv_procfs_read_registry(&lt;br /&gt;
-    char  *page,&lt;br /&gt;
-    char **start,&lt;br /&gt;
-    off_t  off,&lt;br /&gt;
-    int    count,&lt;br /&gt;
-    int   *eof,&lt;br /&gt;
-    void  *data&lt;br /&gt;
-)&lt;br /&gt;
+nv_procfs_open_params(&lt;br /&gt;
+    struct inode *inode,&lt;br /&gt;
+    struct file *file&lt;br /&gt;
+)    &lt;br /&gt;
 {&lt;br /&gt;
-    nv_state_t *nv = data;&lt;br /&gt;
-    nv_linux_state_t *nvl = NULL;&lt;br /&gt;
-    char *registry_keys;&lt;br /&gt;
+    return single_open(file, nv_procfs_show_params, NULL);&lt;br /&gt;
+}&lt;br /&gt;
 &lt;br /&gt;
-    if (nv != NULL)&lt;br /&gt;
-        nvl = NV_GET_NVL_FROM_NV_STATE(nv);&lt;br /&gt;
-    registry_keys = ((nvl != NULL) ?&lt;br /&gt;
-            nvl-&amp;gt;registry_keys : nv_registry_keys);&lt;br /&gt;
+static const struct file_operations nv_procfs_params_fops = {&lt;br /&gt;
+    .owner   = THIS_MODULE,&lt;br /&gt;
+    .open    = nv_procfs_open_params,&lt;br /&gt;
+    .read    = seq_read,&lt;br /&gt;
+    .llseek  = seq_lseek,&lt;br /&gt;
+    .release = single_release,&lt;br /&gt;
+};&lt;br /&gt;
 &lt;br /&gt;
-    *eof = 1;&lt;br /&gt;
-    return sprintf(page, &amp;quot;Binary: \&amp;quot;%s\&amp;quot;\n&amp;quot;, registry_keys);&lt;br /&gt;
-}&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
-nv_procfs_write_registry(&lt;br /&gt;
-    struct file   *file,&lt;br /&gt;
-    const char    *buffer,&lt;br /&gt;
-    unsigned long  count,&lt;br /&gt;
-    void          *data&lt;br /&gt;
+nv_procfs_show_text_file(&lt;br /&gt;
+    struct seq_file *m,&lt;br /&gt;
+    void *v&lt;br /&gt;
 )&lt;br /&gt;
 {&lt;br /&gt;
-    int status = 0;&lt;br /&gt;
-    nv_file_private_t *nvfp = NV_GET_FILE_PRIVATE(file);&lt;br /&gt;
-    char *proc_buffer;&lt;br /&gt;
-    unsigned long bytes_left;&lt;br /&gt;
-&lt;br /&gt;
-    down(&amp;amp;nvfp-&amp;gt;fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);&lt;br /&gt;
-&lt;br /&gt;
-    bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp-&amp;gt;off - 1);&lt;br /&gt;
+    seq_printf(m, &amp;quot;%s&amp;quot;, (char *)m-&amp;gt;private);&lt;br /&gt;
 &lt;br /&gt;
-    if (count == 0)&lt;br /&gt;
-    {&lt;br /&gt;
-        status = -EINVAL;&lt;br /&gt;
-        goto done;&lt;br /&gt;
-    }&lt;br /&gt;
-    else if ((bytes_left == 0) || (count &amp;gt; bytes_left))&lt;br /&gt;
-    {&lt;br /&gt;
-        status = -ENOSPC;&lt;br /&gt;
-        goto done;&lt;br /&gt;
-    }&lt;br /&gt;
-&lt;br /&gt;
-    proc_buffer = &amp;amp;((char *)nvfp-&amp;gt;data)[nvfp-&amp;gt;off];&lt;br /&gt;
-&lt;br /&gt;
-    if (copy_from_user(proc_buffer, buffer, count))&lt;br /&gt;
-    {&lt;br /&gt;
-        nv_printf(NV_DBG_ERRORS, &amp;quot;NVRM: failed to copy in proc data!\n&amp;quot;);&lt;br /&gt;
-        status = -EFAULT;&lt;br /&gt;
-    }&lt;br /&gt;
-    else&lt;br /&gt;
-    {&lt;br /&gt;
-        nvfp-&amp;gt;proc_data = data;&lt;br /&gt;
-        nvfp-&amp;gt;off += count;&lt;br /&gt;
-    }&lt;br /&gt;
-&lt;br /&gt;
-done:&lt;br /&gt;
-    up(&amp;amp;nvfp-&amp;gt;fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]);&lt;br /&gt;
-&lt;br /&gt;
-    return ((status &amp;lt; 0) ? status : (int)count);&lt;br /&gt;
+    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static int&lt;br /&gt;
-nv_procfs_read_text_file(&lt;br /&gt;
-    char  *page,&lt;br /&gt;
-    char **start,&lt;br /&gt;
-    off_t  off,&lt;br /&gt;
-    int    count,&lt;br /&gt;
-    int   *eof,&lt;br /&gt;
-    void  *data&lt;br /&gt;
+nv_procfs_open_text_file(&lt;br /&gt;
+    struct inode *inode,&lt;br /&gt;
+    struct file *file&lt;br /&gt;
 )&lt;br /&gt;
 {&lt;br /&gt;
-    *eof = 1;&lt;br /&gt;
-    return sprintf(page, &amp;quot;%s&amp;quot;, (char *)data);&lt;br /&gt;
+    return single_open(file, nv_procfs_show_text_file, PDE_DATA(inode));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+static const struct file_operations nv_procfs_text_fops = {&lt;br /&gt;
+    .owner   = THIS_MODULE,&lt;br /&gt;
+    .open    = nv_procfs_open_text_file,&lt;br /&gt;
+    .read    = seq_read,&lt;br /&gt;
+    .llseek  = seq_lseek,&lt;br /&gt;
+    .release = single_release,&lt;br /&gt;
+};&lt;br /&gt;
+&lt;br /&gt;
 static void&lt;br /&gt;
 nv_procfs_add_text_file(&lt;br /&gt;
     struct proc_dir_entry *parent,&lt;br /&gt;
@@ -469,22 +506,7 @@&lt;br /&gt;
     const char *text&lt;br /&gt;
 )&lt;br /&gt;
 {&lt;br /&gt;
-    NV_CREATE_PROC_FILE(filename, parent,&lt;br /&gt;
-            nv_procfs_read_text_file, NULL, NULL, (void *)text);&lt;br /&gt;
-}&lt;br /&gt;
-&lt;br /&gt;
-static void nv_procfs_unregister_all(struct proc_dir_entry *entry)&lt;br /&gt;
-{&lt;br /&gt;
-    while (entry)&lt;br /&gt;
-    {&lt;br /&gt;
-        struct proc_dir_entry *next = entry-&amp;gt;next;&lt;br /&gt;
-        if (entry-&amp;gt;subdir)&lt;br /&gt;
-            nv_procfs_unregister_all(entry-&amp;gt;subdir);&lt;br /&gt;
-        remove_proc_entry(entry-&amp;gt;name, entry-&amp;gt;parent);&lt;br /&gt;
-        if (entry == proc_nvidia)&lt;br /&gt;
-            break;&lt;br /&gt;
-        entry = next;&lt;br /&gt;
-    }&lt;br /&gt;
+    proc_create_data(filename, NV_PROC_RO, parent, &amp;amp;nv_procfs_text_fops, (void *)text);&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
@@ -513,26 +535,11 @@&lt;br /&gt;
     if (!proc_nvidia)&lt;br /&gt;
         goto failed;&lt;br /&gt;
 &lt;br /&gt;
-    entry = NV_CREATE_PROC_FILE(&amp;quot;params&amp;quot;, proc_nvidia,&lt;br /&gt;
-        nv_procfs_read_params, NULL, NULL, NULL);&lt;br /&gt;
+    entry = proc_create(&amp;quot;params&amp;quot;, NV_PROC_RO, proc_nvidia, &amp;amp;nv_procfs_params_fops);&lt;br /&gt;
     if (!entry)&lt;br /&gt;
         goto failed;&lt;br /&gt;
 &lt;br /&gt;
-    /*&lt;br /&gt;
-     * entry-&amp;gt;proc_fops originally points to a constant&lt;br /&gt;
-     * structure, so to add more methods for the&lt;br /&gt;
-     * binary registry write path, we need to replace the&lt;br /&gt;
-     * said entry-&amp;gt;proc_fops with a new fops structure.&lt;br /&gt;
-     * However, in preparation for this, we need to preserve&lt;br /&gt;
-     * the procfs read() and write() operations.&lt;br /&gt;
-     */&lt;br /&gt;
-    nv_procfs_registry_fops.read = entry-&amp;gt;proc_fops-&amp;gt;read;&lt;br /&gt;
-    nv_procfs_registry_fops.write = entry-&amp;gt;proc_fops-&amp;gt;write;&lt;br /&gt;
-&lt;br /&gt;
-    entry = NV_CREATE_PROC_FILE(&amp;quot;registry&amp;quot;, proc_nvidia,&lt;br /&gt;
-        nv_procfs_read_registry,&lt;br /&gt;
-        nv_procfs_write_registry,&lt;br /&gt;
-        &amp;amp;nv_procfs_registry_fops, NULL);&lt;br /&gt;
+    entry = proc_create(&amp;quot;registry&amp;quot;, NV_PROC_RW, proc_nvidia, &amp;amp;nv_procfs_registry_fops);&lt;br /&gt;
     if (!entry)&lt;br /&gt;
         goto failed;&lt;br /&gt;
 &lt;br /&gt;
@@ -553,8 +560,7 @@&lt;br /&gt;
 &lt;br /&gt;
     nv_procfs_add_text_file(proc_nvidia_patches, &amp;quot;README&amp;quot;, __README_patches);&lt;br /&gt;
 &lt;br /&gt;
-    entry = NV_CREATE_PROC_FILE(&amp;quot;version&amp;quot;, proc_nvidia,&lt;br /&gt;
-        nv_procfs_read_version, NULL, NULL, NULL);&lt;br /&gt;
+    entry = proc_create(&amp;quot;version&amp;quot;, NV_PROC_RO, proc_nvidia, &amp;amp;nv_procfs_version_fops);&lt;br /&gt;
     if (!entry)&lt;br /&gt;
         goto failed;&lt;br /&gt;
 &lt;br /&gt;
@@ -571,15 +577,11 @@&lt;br /&gt;
         if (!proc_nvidia_gpu)&lt;br /&gt;
             goto failed;&lt;br /&gt;
 &lt;br /&gt;
-        entry = NV_CREATE_PROC_FILE(&amp;quot;information&amp;quot;, proc_nvidia_gpu,&lt;br /&gt;
-            nv_procfs_read_gpu_info, NULL, NULL, nv);&lt;br /&gt;
+       entry = proc_create_data(&amp;quot;information&amp;quot;, NV_PROC_RO, proc_nvidia_gpu, &amp;amp;nv_procfs_gpu_info_fops, nv);&lt;br /&gt;
         if (!entry)&lt;br /&gt;
             goto failed;&lt;br /&gt;
 &lt;br /&gt;
-        entry = NV_CREATE_PROC_FILE(&amp;quot;registry&amp;quot;, proc_nvidia_gpu,&lt;br /&gt;
-            nv_procfs_read_registry,&lt;br /&gt;
-            nv_procfs_write_registry,&lt;br /&gt;
-            &amp;amp;nv_procfs_registry_fops, nv);&lt;br /&gt;
+       entry = proc_create_data(&amp;quot;registry&amp;quot;, NV_PROC_RW, proc_nvidia_gpu, &amp;amp;nv_procfs_registry_fops, nv);&lt;br /&gt;
         if (!entry)&lt;br /&gt;
             goto failed;&lt;br /&gt;
     }&lt;br /&gt;
@@ -587,7 +589,7 @@&lt;br /&gt;
     return 0;&lt;br /&gt;
 #if defined(CONFIG_PROC_FS)&lt;br /&gt;
 failed:&lt;br /&gt;
-    nv_procfs_unregister_all(proc_nvidia);&lt;br /&gt;
+    remove_proc_subtree(&amp;quot;nvidia&amp;quot;, proc_nvidia);&lt;br /&gt;
     return -1;&lt;br /&gt;
 #endif&lt;br /&gt;
 }&lt;br /&gt;
@@ -595,6 +597,6 @@&lt;br /&gt;
 void nv_unregister_procfs(void)&lt;br /&gt;
 {&lt;br /&gt;
 #if defined(CONFIG_PROC_FS)&lt;br /&gt;
-    nv_procfs_unregister_all(proc_nvidia);&lt;br /&gt;
+    remove_proc_subtree(&amp;quot;nvidia&amp;quot;, proc_nvidia);&lt;br /&gt;
 #endif&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Инструкция==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#распаковываем проприетарный драйвер&lt;br /&gt;
&lt;br /&gt;
NVIDIA-Linux-x86_64-319.32.run -x&lt;br /&gt;
&lt;br /&gt;
сd ./NVIDIA-Linux-x86_64-319.32.run/kernel&lt;br /&gt;
&lt;br /&gt;
touch nv-i2c.c.patch&lt;br /&gt;
&lt;br /&gt;
#копируем в nv-i2c.c.patch текст патча&lt;br /&gt;
#применяем патч&lt;br /&gt;
&lt;br /&gt;
patch -p1 &amp;lt;nv-i2c.c.patch&lt;br /&gt;
&lt;br /&gt;
#в случае если будут появляться вопросы о местоположении файлов, &lt;br /&gt;
#просто указать их имя (скопировать из вопроса и вставить в командную строку)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Vix</name></author>
	</entry>
</feed>