[PATCH] Multi-head fix for tdfxfb driver (again)

From: Richard Drummond (evilrich_at_rcdrummond.net)
Date: 10/30/03

  • Next message: ashley_at_alumni.caltech.edu: "2.6 crashes when IP-forwarding"
    To: Linux Fbdev development list <linux-fbdev-devel@lists.sourceforge.net>
    Date:	Thu, 30 Oct 2003 15:52:45 -0000
    
    
    

    Bloody web mail. I'll try that again . . .

    Hi All

    This patch (against 2.6.0-test9) corrects a bug in the tdfxfb driver with
    regard to multi-head set-ups. The driver was stomping all over its default
    fb_fix_screeninfo struct (the global, tdfx_fix) when initializing a card -
    which could potentially causes problems when the time comes to set up the
    next card. This fix makes it copy tdfx_fix first and modify only that copy.

    Cheers,
    Rich

    
    

    --- linux-2.6.0-test9/drivers/video/tdfxfb.c.orig 2003-10-30 08:32:22.000000000 -0500
    +++ linux-2.6.0-test9/drivers/video/tdfxfb.c 2003-10-30 09:43:39.000000000 -0500
    @@ -1152,6 +1152,8 @@
     {
             struct tdfx_par *default_par;
             struct fb_info *info;
    + struct fb_fix_screeninfo *fix;
    +
             int size, err;
     
             if ((err = pci_enable_device(pdev))) {
    @@ -1168,28 +1170,30 @@
             memset(info, 0, size);
         
             default_par = (struct tdfx_par *) (info + 1);
    + info->fix = tdfx_fix;
    + fix = &info->fix;
      
             /* Configure the default fb_fix_screeninfo first */
             switch (pdev->device) {
                     case PCI_DEVICE_ID_3DFX_BANSHEE:
    - strcat(tdfx_fix.id, " Banshee");
    + strcat(fix->id, " Banshee");
                             default_par->max_pixclock = BANSHEE_MAX_PIXCLOCK;
                             break;
                     case PCI_DEVICE_ID_3DFX_VOODOO3:
    - strcat(tdfx_fix.id, " Voodoo3");
    + strcat(fix->id, " Voodoo3");
                             default_par->max_pixclock = VOODOO3_MAX_PIXCLOCK;
                             break;
                     case PCI_DEVICE_ID_3DFX_VOODOO5:
    - strcat(tdfx_fix.id, " Voodoo5");
    + strcat(fix->id, " Voodoo5");
                             default_par->max_pixclock = VOODOO5_MAX_PIXCLOCK;
                             break;
             }
     
    - tdfx_fix.mmio_start = pci_resource_start(pdev, 0);
    - tdfx_fix.mmio_len = pci_resource_len(pdev, 0);
    - default_par->regbase_virt = ioremap_nocache(tdfx_fix.mmio_start, tdfx_fix.mmio_len);
    + fix->mmio_start = pci_resource_start(pdev, 0);
    + fix->mmio_len = pci_resource_len(pdev, 0);
    + default_par->regbase_virt = ioremap_nocache(fix->mmio_start, fix->mmio_len);
             if (!default_par->regbase_virt) {
    - printk("fb: Can't remap %s register area.\n", tdfx_fix.id);
    + printk("fb: Can't remap %s register area.\n", fix->id);
                     goto out_err;
             }
         
    @@ -1199,9 +1203,9 @@
                     goto out_err;
             }
     
    - tdfx_fix.smem_start = pci_resource_start(pdev, 1);
    - if (!(tdfx_fix.smem_len = do_lfb_size(default_par, pdev->device))) {
    - printk("fb: Can't count %s memory.\n", tdfx_fix.id);
    + fix->smem_start = pci_resource_start(pdev, 1);
    + if (!(fix->smem_len = do_lfb_size(default_par, pdev->device))) {
    + printk("fb: Can't count %s memory.\n", fix->id);
                     release_mem_region(pci_resource_start(pdev, 0),
                                        pci_resource_len(pdev, 0));
                     goto out_err;
    @@ -1215,10 +1219,10 @@
                     goto out_err;
             }
     
    - info->screen_base = ioremap_nocache(tdfx_fix.smem_start,
    - tdfx_fix.smem_len);
    + info->screen_base = ioremap_nocache(fix->smem_start,
    + fix->smem_len);
             if (!info->screen_base) {
    - printk("fb: Can't remap %s framebuffer.\n", tdfx_fix.id);
    + printk("fb: Can't remap %s framebuffer.\n", fix->id);
                     release_mem_region(pci_resource_start(pdev, 1),
                                        pci_resource_len(pdev, 1));
                     release_mem_region(pci_resource_start(pdev, 0),
    @@ -1238,13 +1242,13 @@
                     goto out_err;
             }
     
    - printk("fb: %s memory = %dK\n", tdfx_fix.id, tdfx_fix.smem_len >> 10);
    + printk("fb: %s memory = %dK\n", fix->id, fix->smem_len >> 10);
     
    - tdfx_fix.ypanstep = nopan ? 0 : 1;
    - tdfx_fix.ywrapstep = nowrap ? 0 : 1;
    + fix->ypanstep = nopan ? 0 : 1;
    + fix->ywrapstep = nowrap ? 0 : 1;
        
             info->fbops = &tdfxfb_ops;
    - info->fix = tdfx_fix;
    +/* info->fix = tdfx_fix; */
             info->par = default_par;
             info->pseudo_palette = (void *)(default_par + 1);
             info->flags = FBINFO_FLAG_DEFAULT;

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: ashley_at_alumni.caltech.edu: "2.6 crashes when IP-forwarding"