Results 1 to 3 of 3

Thread: solution for compiling the broadcom 431* driver in linux kernal 3.10 and above

  1. #1

    Exclamation solution for compiling the broadcom 431* driver in linux kernal 3.10 and above

    In linux kernal 3.10 and above,the function "create_proc_entry" has been removed.
    so the broadcom 431* driver can not be compiled correctly.
    The solution is to make some modifications to the "static int
    wl_reg_proc_entry(wl_info_t *wl)" function in "src/wl/sys/wl_linux.c".
    Modify it as below:
    //-------------------start of code-------------------------------------------------------------
    static int
    wl_reg_proc_entry(wl_info_t *wl)
    {
    char tmp[32];
    sprintf(tmp, "%s%d", HYBRID_PROC, wl->pub->unit);
    // hack code to fit kernel 3.10.0 above
    #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
    if ((wl->proc_entry = create_proc_entry(tmp, 0644, NULL)) == NULL) {
    WL_ERROR(("%s: create_proc_entry %s failed\n", __FUNCTION__, tmp));
    ASSERT(0);
    return -1;
    }
    wl->proc_entry->read_proc = wl_proc_read;
    wl->proc_entry->write_proc = wl_proc_write;
    wl->proc_entry->data = wl;
    #else
    static const struct file_operations wl_proc_fops = {
    .owner = THIS_MODULE,
    .read = wl_proc_read,
    .write = wl_proc_write,
    };
    if ((wl->proc_entry = proc_create(tmp, 0644, NULL,&wl_proc_fops)) == NULL) {
    WL_ERROR(("%s: create_proc_entry %s failed\n", __FUNCTION__, tmp));
    ASSERT(0);
    return -1;
    }
    #endif
    return 0;
    }

    //-------------------end of code-------------------------------------------------------------

    After this change,you can follow the readme tutorial to compile and install the driver correctly.

  2. #2
    Join Date
    Jun 2008
    Location
    Netherlands
    Posts
    29,775

    Default Re: solution for compiling the broadcom 431* driver in linux kernal 3.10 and above

    Please use CODE tags around your copied/pasted computer text. You get them by clicking on the # button in the tool bar of the post editor.
    Henk van Velden

  3. #3

    Default Re: solution for compiling the broadcom 431* driver in linux kernal 3.10 and above

    Quote Originally Posted by zhouhaiyangqq View Post
    After this change,you can follow the readme tutorial to compile and install the driver correctly.
    Or you could just use the RPM packages from Packman.
    They contain a more sophisticated patch btw:
    https://pmbs.links2linux.de/package/...ect=Essentials
    Code:
    --- a/src/wl/sys/wl_linux.c    2013-08-01 08:52:22.000000000 +0200
    +++ b/src/wl/sys/wl_linux.c    2013-09-13 14:25:36.463020788 +0200
    @@ -910,7 +910,11 @@
         pci_set_drvdata(pdev, NULL);
     }
     
    +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
     static struct pci_driver wl_pci_driver = {
    +#else
    +static struct pci_driver wl_pci_driver __refdata = {
    +#endif
         name:        "wl",
         probe:        wl_pci_probe,
         suspend:    wl_suspend,
    @@ -3235,7 +3239,7 @@
     void
     wl_tkip_printstats(wl_info_t *wl, bool group_key)
     {
    -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14)
    +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) && LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
         char debug_buf[512];
         int idx;
         if (wl->tkipmodops) {
    @@ -3408,6 +3412,7 @@
         return 0;
     }
     
    +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
     static int
     wl_proc_read(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
     {
    @@ -3462,19 +3467,90 @@
         return length;
     }
     
    +#else
    +
    +static int
    +wl_proc_read(struct seq_file *seq, void *offset)
    +{
    +    wl_info_t * wl = (wl_info_t *)seq->private;
    +    int bcmerror, to_user;
    +
    +    WL_LOCK(wl);
    +    bcmerror = wlc_ioctl(wl->wlc, WLC_GET_MONITOR, &to_user, sizeof(int), NULL);
    +    WL_UNLOCK(wl);
    +
    +    seq_printf(seq, "%d\n", to_user);
    +    return bcmerror;
    +}
    +
    +static ssize_t wl_proc_write(struct file *file, const char __user *buff,
    +                 size_t length, loff_t *ppos)
    +{
    +    struct seq_file *seq = file->private_data;
    +    wl_info_t * wl = (wl_info_t *)seq->private;
    +    int bcmerror, from_user = 0;
    +
    +    if (length != 1) {
    +        WL_ERROR(("%s: Invalid data length\n", __FUNCTION__));
    +        return -EIO;
    +    }
    +
    +    if (copy_from_user(&from_user, buff, 1)) {
    +        WL_ERROR(("%s: copy from user failed\n", __FUNCTION__));
    +        return -EFAULT;
    +    }
    +
    +    if (from_user >= 0x30)
    +        from_user -= 0x30;
    +
    +    WL_LOCK(wl);
    +    bcmerror = wlc_ioctl(wl->wlc, WLC_SET_MONITOR, &from_user, sizeof(int), NULL);
    +    WL_UNLOCK(wl);
    +
    +    if (bcmerror < 0) {
    +        WL_ERROR(("%s: SET_MONITOR failed with %d\n", __FUNCTION__, bcmerror));
    +        return -EIO;
    +    }
    +    *ppos += length;
    +    return length;
    +}
    +
    +static int wl_proc_open(struct inode *inode, struct file *file)
    +{
    +    return single_open(file, wl_proc_read, PDE_DATA(inode));
    +}
    +
    +static const struct file_operations wl_proc_fops = {
    +    .owner = THIS_MODULE,
    +    .open = wl_proc_open,
    +    .read = seq_read,
    +    .write = wl_proc_write,
    +    .llseek = seq_lseek,
    +    .release = single_release,
    +};
    +#endif
    +
     static int
     wl_reg_proc_entry(wl_info_t *wl)
     {
         char tmp[32];
         sprintf(tmp, "%s%d", HYBRID_PROC, wl->pub->unit);
    -    if ((wl->proc_entry = create_proc_entry(tmp, 0644, NULL)) == NULL) {
    +
    +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
    +    wl->proc_entry = create_proc_entry(tmp, 0644, NULL);
    +    if (wl->proc_entry) {
    +        wl->proc_entry->read_proc = wl_proc_read;
    +        wl->proc_entry->write_proc = wl_proc_write;
    +        wl->proc_entry->data = wl;
    +    } 
    +#else
    +    wl->proc_entry = proc_create_data(tmp, 0644, NULL, &wl_proc_fops, wl);
    +#endif
    +    if (!wl->proc_entry) {
             WL_ERROR(("%s: create_proc_entry %s failed\n", __FUNCTION__, tmp));
             ASSERT(0);
             return -1;
         }
    -    wl->proc_entry->read_proc = wl_proc_read;
    -    wl->proc_entry->write_proc = wl_proc_write;
    -    wl->proc_entry->data = wl;
         return 0;
     }
     #ifdef WLOFFLD

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •