Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / char / agp / backend.c
index 4d4e602..509adc4 100644 (file)
@@ -97,7 +97,7 @@ void agp_backend_release(struct agp_bridge_data *bridge)
 EXPORT_SYMBOL(agp_backend_release);
 
 
-static struct { int mem, agp; } maxes_table[] = {
+static const struct { int mem, agp; } maxes_table[] = {
        {0, 0},
        {32, 4},
        {64, 28},
@@ -147,6 +147,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
                        printk(KERN_ERR PFX "unable to get memory for scratch page.\n");
                        return -ENOMEM;
                }
+               flush_agp_mappings();
 
                bridge->scratch_page_real = virt_to_gart(addr);
                bridge->scratch_page =
@@ -187,9 +188,11 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
        return 0;
 
 err_out:
-       if (bridge->driver->needs_scratch_page)
+       if (bridge->driver->needs_scratch_page) {
                bridge->driver->agp_destroy_page(
                                gart_to_virt(bridge->scratch_page_real));
+               flush_agp_mappings();
+       }
        if (got_gatt)
                bridge->driver->free_gatt_table(bridge);
        if (got_keylist) {
@@ -206,15 +209,16 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
                bridge->driver->cleanup();
        if (bridge->driver->free_gatt_table)
                bridge->driver->free_gatt_table(bridge);
-       if (bridge->key_list) {
-               vfree(bridge->key_list);
-               bridge->key_list = NULL;
-       }
+
+       vfree(bridge->key_list);
+       bridge->key_list = NULL;
 
        if (bridge->driver->agp_destroy_page &&
-           bridge->driver->needs_scratch_page)
+           bridge->driver->needs_scratch_page) {
                bridge->driver->agp_destroy_page(
                                gart_to_virt(bridge->scratch_page_real));
+               flush_agp_mappings();
+       }
 }
 
 /* When we remove the global variable agp_bridge from all drivers
@@ -223,12 +227,12 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
 
 struct agp_bridge_data *agp_alloc_bridge(void)
 {
-       struct agp_bridge_data *bridge = kmalloc(sizeof(*bridge), GFP_KERNEL);
+       struct agp_bridge_data *bridge;
 
+       bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
        if (!bridge)
                return NULL;
 
-       memset(bridge, 0, sizeof(*bridge));
        atomic_set(&bridge->agp_in_use, 0);
        atomic_set(&bridge->current_memory_agp, 0);